hdu acm steps 2.2.3

来源:互联网 发布:树莓派ubuntu系统 ssh 编辑:程序博客网 时间:2024/05/16 20:30

题目:http://acm.hdu.edu.cn/showproblem.php?pid=1997

也是模拟题对每个过程分析清楚便可得到答案

如果全部在A或者C上,那就是满足条件的。

如果最大的在B上则不满足条件。

如果最大的在A上,那么尽可能的在B叠上其余的。然后把最大的给C。

如果最大的在C上,那么第二大一定在B或者C上。

#include<iostream>#include<cstdio>using namespace std;int main(){    int one[4],n[4],h[4][1000];    int a,b,c,i,N;    int cas,t;    bool flag;    scanf("%d",&cas);    while(cas--)    {        a=1;        b=2;        c=3;        one[a]=1,one[b]=1,one[c]=1;        scanf("%d",&N);         scanf("%d",&n[a]);        for(i=one[a];i<=n[a];i++)            scanf("%d",&h[a][i]);         scanf("%d",&n[b]);        for(i=one[b];i<=n[b];i++)            scanf("%d",&h[b][i]);         scanf("%d",&n[c]);        for(i=one[c];i<=n[c];i++)            scanf("%d",&h[c][i]);         while(1)        {            if(n[c]==N||n[a]==N)//如果全都在a或c上。            {                flag=true;                break;            }            if(n[b]>0&&h[b][one[b]]==N)//假如最大的在b上            {                flag=false;                 break;            }            if(n[a]>0&&h[a][one[a]]==N)//判断第三种情况            {                     N--;                     n[a]--;                     one[a]++;                     t=b;                     b=c;                     c=t;                     continue;            }            if(h[c][one[c]]==N&&n[c]>0)//判断第四种情况            {                        N--;                        n[c]--;                        one[c]++;                        t=b;                        b=a;                        a=t;                        continue;            }        }        if(flag)            printf("true\n");        else            printf("false\n");    }}


 

原创粉丝点击