打到一半CF挂了。。。于是变成了一场unrated,感觉不亏?
A. ACM ICPC
题意:现在有六个人的分数,问是否能够将其分成两组使得分数的和相同。因为是ACM所以两组必须都是三个人(我才不会说第一次没注意到。。。)。然后就是一通模拟了。
#include<cstdio>
using namespace std;
int i,j,k,l,n,m,sum1,sum2,a[10],t;
int main()
{
for (i=1;i<=6;i++)
{
scanf("%d",&a[i]);
}
for (i=0;i<64;i++)
{
sum1=sum2=t=0;
for (j=1;j<=6;j++) if (i&(1<<(j-1))) sum1+=a[j],t++;else sum2+=a[j];
if (sum1==sum2&&t==3) {printf("YES");return 0;}
}
puts("NO");
}
B.Vlad and Cafes
题意:给定n个数,找到最大的数L使得在[L,n]中所有数字都出现了。输出a[L]。
#include<cstdio>
using namespace std;
#define N 200005
int i,j,k,l,n,m,a[N],x[N],y,ans;
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&a[i]);
for (i=n;i;i--) if (x[a[i]]==0) x[a[i]]=i;
ans=2147483647;
for (i=1;i<=n;i++) if (x[a[i]]<ans)
{
ans=x[a[i]];
y=a[i];
}
printf("%d",y);
}
C. Petya and Catacombs
题意:有一个人在0时刻从1号房间出发,每个时刻到达一个房间时记录下一个值a[i]。
- 当走到新的房间时,a[i]为严格小于时间t的任意值。
- 当走到老的房间时,a[i]为上一次走到这个房间的时间t。
现给出最终序列a,问最少房间数。
做法:个人认为这道题的解法非常巧妙。我们考虑a[i]的生成方式,要使总房间数最小就意味着要使走重复的房间最多,假设第i个房间与从a[i]时间走到的房间相同。显然我们会遇到矛盾的情况,即有两个时刻都指向同一个房间。我们认为其中必有一个房间是新增的,只需统计这样的情况数量即可。
#include<cstdio>
using namespace std;
#define N 200005
int i,j,k,l,n,m,ans,a[N],x[N];
int main()
{
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&a[i]);
for (i=n;i;i--)
if (x[a[i]]==0) x[a[i]]=1;
else ans++;
printf("%d",ans+1);
}