ACM集训day4

7.14

下午打了个模拟赛,3个小时,总共6题,只A了2题orz…不过居然抢了一题第一

King’s Phone

note:这题可以说折磨了我几天了…从一开始的Runtime Error 到Time time Exceed…再到WA…最后发现了一个特别智障的错误,终于AC了

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define maxn 30
int a[maxn];
int num[maxn];
/*bool judge(int a,int b)     /*这是看屡试不过时候看别人博客学来的判断函数,配合下面(*)的注释使用*/
{
    if(a > b) swap(a,b);
    if(a == 1 && b == 9)
        return vis[5];
    else if(a == 1 && b == 3)
        return vis[2];
    else if(a == 1 && b == 7)
        return vis[4];
    else if(a == 3 && b == 9)
        return vis[6];
    else if(a == 2 && b == 8)
        return vis[5];
    else if(a == 3 && b == 7)
        return vis[5];
    else if(a == 4 && b == 6)
        return vis[5];
    else if(a == 7 && b == 9)
        return vis[8];
    else
        return 1;
}*/
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {

        int b[20]={0};
        int n,i,j;
        memset(a,0,sizeof(a));
        memset(num,0,sizeof(num));
        int tag=1;
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
            if(a[i]>9||a[i]<1)
                    tag=0;
            else 
                if(b[a[i]]++)    /*先过一轮看有没有重复 **注意:这里容易犯越界错误导致RE要判定a[i]是19才能b[a[i]],否则假设a[i]=100,就越界!** */
                    tag=0;
        }
        if(n<4||!tag)
        {
            printf("invalid\n");
            continue;
        }

        for(i=2;i<=n;i++)
        {
            num[a[i-1]]++;
            if(/*!judge(a[i-1],a[i])||*/num[a[i]]>1)  //(*)
            {
                tag=0;
                break;
            }
            if(((a[i-1]==1&&a[i]==3)||(a[i]==1&&a[i-1]==3))&&num[2]==0)  /*暴力枚举所有情况*/
            {
                tag=0;
                break;
            }
            else if(((a[i-1]==1&&a[i]==7)||(a[i]==1&&a[i-1]==7))&&num[4]==0)
            {
                tag=0;
                break;
            }
            else if(((a[i-1]==1&&a[i]==9)||(a[i]==1&&a[i-1]==9))&&num[5]==0)
            {
                tag=0;
                break;
            }
            else if(((a[i-1]==3&&a[i]==7)||(a[i]==3&&a[i-1]==7))&&num[5]==0)
            {
                tag=0;
                break;
            }
            else if(((a[i-1]==3&&a[i]==9)||(a[i]==3&&a[i-1]==9))&&num[6]==0)
            {
                tag=0;
                break;
            }
            else if(((a[i-1]==7&&a[i]==9)||(a[i]==7&&a[i-1]==9))&&num[8]==0)
            {
                tag=0;
                break;
            }
            else if(((a[i-1]==4&&a[i]==6)||(a[i]==4&&a[i-1]==6))&&num[5]==0)
            {
                tag=0;
                break;
            }
            else if(((a[i-1]==2&&a[i]==8)||(a[i]==2&&a[i-1]==8))&&num[5]==0)
            {
                tag=0;
                break;
            }
            }
            if(!tag)
                printf("invalid\n");  /* **最弱智的地方来了...搞半天单词拼成invaild...我要学好英语...** */
            else
                printf("valid\n");
    }
    return 0;
}

===============================我是分割线=====================================

CA Loves Stick

note:做题先看数据范围,最关键的坑是0≤a,b,c,d≤2^63−1,刚好是long long的最大值,那么如果a和b加起来就有可能爆

#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
using namespace std;
long long f[10005];
int main()
{
    int t;

    scanf("%d",&t);
    while(t--)
    {


        long long a,b,c,d;
        memset(f,0,sizeof(f));

            scanf("%lld %lld %lld %lld",&a,&b,&c,&d);
            f[0]=a;f[1]=b;f[2]=c;f[3]=d;
        sort(f,f+4);
        if(a==0||b==0||c==0||d==0)
        {

             printf("No\n");
             continue;
        }
        if(f[1]<=f[3]-f[2]-f[0])  /*这个判断是我舍友想出来的,**非常巧妙**,不会爆了long long。f[3]-f[2]顶多等于0,而f[0]又不会超出long long 范围.原来我写的是f[3]-f[2]-f[1]-f[0]>=0,这样的话如果全部数都等于2^63-1,这就尴尬了...*/
            printf("No\n");
       else
            printf("Yes\n");
    }
    return 0;
}

未完…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值