996B World Cup
题意:给你n个通道,每一分钟一个通道只能进一个人到广场。一开始你站在第一个通道,如果该通道上还有人,你就要站到下一个通道,如果你站到最后一个通道时还不能进入,就站到第一个通道去。
分析:每到一个通道减去该通道已经进去了多少人,再判断该通道排队人数是否小于等于0,如果是,则输出该通道,否则,进入下一个通道,重复刚才的过程。WA了一发,错在每次用通道人数-=已经进去的人数,当他如果不是在第一轮就全部进入的话,会把上一轮减掉的已经进去的人数再减一次,多减掉了一部分。
还有同学讲的用周期,然后用周期来判断:
1 2 3 4
k1*n+1 k2*n+2 k3*n+3 k4*n+4
k1*n+1=a1;
k2*n+2=a2;
k3*n+3=a3;
k4*n+4=a4;
k是每个通道的人全部进入所需要的周期
a是每个通道的人数
n是通道数
比较哪个通道的k值最小并且是最早出现
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
int a[100005];
int main()
{
int n,i,t,tt;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
t=0;
for(i=1;i<=n;i++)
{
tt=a[i]-t;
t++;
if(tt<=0)
{
printf("%d\n",i);
break;
}
if(i==n&&tt>0)
{
i=0;
}
}
}
return 0;
}
1004 B. Sonya and Exhibition
题目链接:http://codeforces.com/contest/1004/problem/B
题意:sonya要办一个花卉展,有玫瑰花和百合花,为了让游客数尽可能的多,就得让美丽值最大,美丽值等于游客观赏区间里玫瑰花数量乘以百合花的数量。
分析:如何让数量相乘最大,想想就能知道,让他们数量接近或相等时,相乘最大。当观赏区间花的数量为偶数时,玫瑰花和百合花的数量相等,当观赏区间的花为奇数时,玫瑰花和百合花的数量相差1。然后就是每个观赏区间最大,不管观赏区间有没有相交,只要让一个玫瑰花挨着一个玫瑰花就行,在本子上画画就可以看出来。
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
int n,m,i,x,y;
while(~scanf("%d %d",&n,&m))
{
for(i=1;i<=m;i++)
scanf("%d %d",&x,&y);
for(i=1;i<=n;i++)
{
if(i%2==0)
printf("1");
else
printf("0");
}
printf("\n");
}
return 0;
}
991A. If at first you don't succeed...
最简单的容斥原理
题意:一共有N个人,vasya没通过考试,考得好的人选择去A或B餐厅庆祝,考得更好的人AB餐厅都去。去A餐厅的人有a,去B餐厅的人有b,AB餐厅都去的人有c,求没通过考试的人。
分析:当去A餐厅或B餐厅的人小于N时不存在,考得好的人数大于等于总人数时不存在
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
int main()
{
int a,b,c,n;
while(~scanf("%d %d %d %d",&a,&b,&c,&n))
{
int t;
if(a<c||b<c)
{
printf("-1\n");
continue;
}
else if(a+b-c>=n)
{
printf("-1\n");
continue;
}
else
{
t=n-a-b+c;
}
printf("%d\n",t);
}
return 0;
}