贪心局限性

https://codeforces.com/contest/1561/problem/C 题目链接

t个测试样例,每个测试样例n个洞穴,接下来n行每行第一个m为该洞穴怪兽个数,接下来 m个数字为怪兽护甲,当且仅当英雄的能力大于怪兽护甲时才能击败该怪兽,击败后能力加1;

 

错误代码:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a[100010];
 4 struct node
 5 {
 6     int minn;
 7     int maxx;
 8     int sum;
 9 }b[100010];
10 int cnt;
11 bool cmp(node a,node b)
12 {
13     return a.minn<b.minn;
14 }
15 int main()
16 {
17     ios::sync_with_stdio(false);
18     cin.tie(0);
19     cout.tie(0);
20     int t;
21     cin>>t;
22     while(t--)
23     {
24         cnt=0;
25         int k;
26         cin>>k;
27         while(k--)
28         {
29             int n;
30             cin>>n;
31             cin>>a[1];
32             int minn=a[1]+1;
33             int now=a[1]+2;
34             for(int i=2;i<=n;i++)
35             {
36                 cin>>a[i];
37             }
38             for(int i=2;i<=n;i++)
39             {
40                 //cin>>a[i];
41                 if(a[i]>=now)
42                 {
43                     minn=a[i]-i+2;
44                     //cout<<minn<<endl;
45                     now=a[i]+2;
46                 }
47                 else now++;
48                 //cout<<minn<<' '<<now<<endl; 
49             }
50             b[++cnt].minn=minn;
51             b[cnt].maxx=now;
52             b[cnt].sum=n;
53             //cout<<b[cnt].minn<<' '<<b[cnt].maxx<<' '<<endl;
54         }
55         sort(b+1,b+1+cnt,cmp);
56         int now=b[1].maxx;
57         int sum=b[1].sum;
58         int ans=b[1].minn;
59         for(int i=2;i<=cnt;i++)
60         {
61             if(now<=b[i].minn)
62             {
63                 ans=b[i].minn-sum;
64             }
65             now=b[i].maxx;
66             sum+=b[i].sum;
67         }
68 //        for(int i=1;i<=cnt;i++)
69 //        {
70 //            cout<<b[i].minn<<' '<<b[i].maxx<<' '<<endl;
71 //        }
72         cout<<ans<<endl;
73     }
74 }

正确代码;

#include <bits/stdc++.h>
using namespace std;
int a[100010];
struct node
{
    int minn;
    int maxx;
    int sum;
}b[100010];
int cnt;
bool cmp(node a,node b)
{
    return a.minn<b.minn;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int t;
    cin>>t;
    while(t--)
    {
        cnt=0;
        int k;
        cin>>k;
        while(k--)
        {
            int n;
            cin>>n;
            cin>>a[1];
            int minn=a[1]+1;
            int now=a[1]+2;
            for(int i=2;i<=n;i++)
            {
                cin>>a[i];
            }
            for(int i=2;i<=n;i++)
            {
                //cin>>a[i];
                if(a[i]>=now)
                {
                    minn=max(a[i]-i+2,minn);
                    //cout<<minn<<endl;
                    now=a[i]+2;
                }
                else now++;
                //cout<<minn<<' '<<now<<endl; 
            }
            b[++cnt].minn=minn;
            b[cnt].maxx=now;
            b[cnt].sum=n;
            //cout<<b[cnt].minn<<' '<<b[cnt].maxx<<' '<<endl;
        }
        sort(b+1,b+1+cnt,cmp);
        int now=b[1].maxx;
        int sum=b[1].sum;
        int ans=b[1].minn;
        //cout<<ans<<endl;
        for(int i=2;i<=cnt;i++)
        {
            if(now<=b[i].minn)
            {
                ans=max(ans,b[i].minn-sum);
            }
            now=b[i].maxx;
            sum+=b[i].sum;
            //cout<<ans<<endl;
        }
//        for(int i=1;i<=cnt;i++)
//        {
//            cout<<b[i].minn<<' '<<b[i].maxx<<' '<<endl;
//        }
        cout<<ans<<endl;
    }
}

区别样例:

1 
8 6 22 11 16 12 12 16 1 6 4 19 1 15 22 10 24 11 6 7 11 15 20 22 2 6 10 5 3 6 1 12 24 20 4 1 23 6 10 3 24 1 24 8 1 19 7 8 23 4 5 7 20 18

 

 

 

上一篇:CF1391D-505 (思维结论 + 暴力 + 状压dp)


下一篇:2021牛客多校4 C - LCS (构造)