题目大意:给出n根绳子,每根绳子都有一个长度ai,先将它们全都连在一起,之后求一种方案解开绳子之间的结使得每一次解开一个结时,这个结所在的连续一段的绳子的总长度都不小于L.
首先这是一道水题(只要你看懂了题目),我们很容易得出一个简单的解法,就是若要解开所有结,我们就需要找到一个结两边的两根绳子长度之和不小于L,我们就可以从两边开始不停打开结,直到中间的结被打开.
这种做法很显然是正确的.
但是第一次我写的时候顿时思绪天马行空,甚至想到了线段树.
结应该从两边开始向内部解.
然而我输出方案的时候,直接顺序枚举了一遍,导致右半边的时候我是直接从内往外解的.
所以代码如下:
#include<bits/stdc++.h> using namespace std; const int N=100000; int a[N+1],L,n; inline void into(){ scanf("%d%d",&n,&L); for (int i=1;i<=n;i++) scanf("%d",&a[i]); } inline void work(){ } inline void outo(){ for (int i=1;i<n;i++) if (a[i]+a[i+1]>=L) { printf("Possible\n"); for (int j=1;j<i;j++) printf("%d\n",j); for (int j=n-1;j>i;j--) printf("%d\n",j); printf("%d\n",i); return; } printf("Impossible\n"); } int main(){ into(); work(); outo(); return 0; }