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]是1到9才能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;
}
未完…