atcoder agc 002 C做题有感

题目:atcoder agc 002 C.

题目大意:给出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;
}

猜你喜欢

转载自blog.csdn.net/hzk_cpp/article/details/80641658
今日推荐