杭电-5596

来源:互联网 发布:律所 知乎 编辑:程序博客网 时间:2024/06/10 11:46
刚开始做的时候并不会,看了大神的,发现自己弱爆了

解题思路:

              1、明确大王发功给gt加能力值不会影响到gt去消灭它前面的且不同组能力比自己小的gt(不理解的自己写几个

              2、明确 1 以后就好做了,首先将大王所有发功结束后的gt能力值计算出来,用一个数字gtn[i]存储
              3、举例:0 组消灭 1 组。根据消灭的条件,我们从后面向前面遍历,我们只要保证每次 0 组 MAX0(MAX0                     表示 0 组用当前的最大值)去消灭   1 组的gt,
注:当前最大值是指从后面向前遍历,当i=n时,MAX0=gtn[n];   当i=n-1;时MAX0与gtn[n-1]比较大小,MAX0取大值
表达可能不清楚,多多包涵,结合代码应该可以看懂


#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int gt[50005];//表示所在组
int gtn[50005];//表示能力值
int d[50005];//表示王发功时间
int main()
{
    int T,n,m;
    int i,k,kt;
    int p,t;
    scanf ("%d",&T);
    while (T--)
    {
        memset(d,0,sizeof(d));
        scanf ("%d%d",&n,&m);
        for (i=1; i<=n; i++)
        {
            scanf ("%d%d",&gt[i],&gtn[i]);
            die[i]=1;//初始化为 1 表示活
        }


        for (i=1; i<=m; i++)
        {
            scanf ("%d",&p);
            d[p]++;
        }
        for (i=n; i>0; i--)//记录每个gt可以增加的能力值
        {
            d[i]+=d[i+1];
        }
        for (i=n; i>0; i--)//更新能力值
        {
            gtn[i]+=d[i];
        }
       int MAX1=0;
        int MAX0=0;
        int as=0;
        for (i=n; i>0; i--)
        {
                if (gt[i]==0)
                {
                        if (gtn[i]<MAX1) as++;


                        if (gtn[i]>MAX0) MAX0=gtn[i];
                }
                if (gt[i]==1)
                {
                        if (gtn[i]<MAX0) as++;


                        if (gtn[i]>MAX1) MAX1=gtn[i];
                }
        }
        printf("%d\n",n-as);
    }
    return 0;
}
0 0
原创粉丝点击