返回顶部

2017, X Samara Regional Intercollegiate Programming Contest M. Last Man Standing (贪心,双指针)

  • 题意:有\(n\)个吃鸡玩家,在某个时间段给你他们每个人的杀敌数,判断数据是否合法,并输出每个人对应的杀敌情况.

  • 题解:刚开始写的是直接暴力枚举,向后去找并且标记,然后存到vector最后输出,结果一直MLE,后来发现可以用双指针来搞.首先只要总杀敌数不大于\(n-1\),那么就永远都是合法的,然后不难发现,因为是降序排列,那么后面的人都可以是前面人的炮灰,所以我们用左指针反着找到第一个不为\(0\)的数,每次对左指针所在的数\(-1\),那么右指针就要向左移一个(因为它被左指针干掉了),若左指针所在的数变为\(0\)了,就要向左移一个(已经满足杀敌数了),每次都输出一下就好了.

  • 代码:

    int n;
    int a[N];
     
    int main() {
        //ios::sync_with_stdio(false);cin.tie(0);
        scanf("%d",&n);
        ll sum=0;
        for(int i=1;i<=n;++i){
            scanf("%d",&a[i]);
            sum+=a[i];
        }
     
        if(sum>n-1){
            puts("NO");
        }
        else{
            puts("YES");
            int l=n;
            int r=n;
            while(a[l]==0) l--;
            while(l>=1){
                printf("%d %d\n",l,r);
                r--;
                a[l]--;
                if(a[l]==0) l--;
            }
        }
     
        return 0;
    }
    
posted @ 2020-08-14 11:54  _Kolibri  阅读(129)  评论(0)    收藏  举报