The 12th UESTC Programming Contest Warmup #1
链接:点击打开链接
题目来源:2013 ACM ICPC South Central USA RegionalProgramming Contest
B - Effective Infection Time
模拟题(水),主要是正确理解题意。
D – Multikill
题意:给定平面上点的个数(0<=N<=25),和半径R.求用半径为R的圆最多能覆盖的点的个数。
思路:一定有两个点在圆周上,所以可以根据此条件确定圆,从而求得答案。
E – Virology
题意:给定14个数字,(1..9),每个相同的数字不超过3个。判断是否能满足题目的条件。
条件:1.必须含有一个对子(pair),即两个相等的数字,如[11].
2.(1)三个连续的(straight)( [1 2 3],[2 3 4]等),(2)三个相同的(triples)([1 1 1],[3 3 3]等)
这两种情况加起来有4个.
并且注意到给出的数字的顺序不重要,即可以自己任意变换顺序.
解法:我们注意到数字只有1..9,并且每个不超过三个,于是我们可以用sum[i]来记录数字i总共出现了多少次。然后注意到给出的顺序并不重要。
由于一定有一个是两个相同的,我们可以先枚举这个条件,
然后再进行搜索。
条件2可由下面的情况构成:
(1)4 straight, 0 triples
(2) 3 straight, 1 triples
(3) 2 straight, 2triples
(4) 1 straight, 3triples
(5) 0 straight, 4triples
根据条件进行搜索即可。
F - WorstCase Scenario
根据题意进行模拟。
H – Zombdar
字符串处理题。
我的代码:
B:
#include<cstdio>
#include<iostream>
#define rep(i,n) for(int i=0;i<n;i++)
using namespace std;
int sm,sy,em,ey,n;
int main()
{
scanf("%d",&n);
rep(i,n){
scanf("%d%d",&sm,&sy);
scanf("%d%d",&em,&ey);
float ans=0;
if(sy==ey){
ans=(0.5/(12-sm+1))*(em-sm);
printf("%.4f\n",ans);
continue;
}
ans=0.5+(ey-sy-1);
ans+=(float)(em-1)/12;
printf("%.4f\n",ans);
}
return 0;
}
D:
#include<cstdio>
#include<iostream>
#include<cmath>
#define rrep(i,n) for(int i=1;i<=n;i++)
using namespace std;
double aa,bb,cc,xx,yy;
double x[30],y[30];
double k,b,r;
int fans,n;
double calc()
{
return (bb*bb-4*aa*cc);
}
void worka(double x1,double y1,double x2,double y2)
{
if(y1==y2)
{
xx=(x1+x2)/2;
aa=1;
bb=-2*y1;
cc=y1*y1+xx*xx+x1*x1-2*xx*x1-r*r;
double deta=calc();
yy=(-bb+sqrt(deta))/(2*aa);
return;
}
k=-(x1-x2)/(y1-y2);
double x0=(x1+x2)/2,y0=(y1+y2)/2;
b=-k*x0+y0;
aa=(1+k*k);bb=(2*k*b-2*k*y1-2*x1);cc=-2*b*y1+y1*y1+b*b+x1*x1-r*r;
double deta=calc();
xx=(-bb+sqrt(deta))/(2*aa);
yy=k*xx+b;
}
void workb(double x1,double y1,double x2,double y2)
{
if(y1==y2)
{
xx=(x1+x2)/2;
aa=1;
bb=-2*y1;
cc=y1*y1+xx*xx+x1*x1-2*xx*x1-r*r;
double deta=calc();
yy=(-bb-sqrt(deta))/(2*aa);
return;
}
k=-(x1-x2)/(y1-y2);
double x0=(x1+x2)/2,y0=(y1+y2)/2;
b=-k*x0+y0;
aa=(1+k*k);bb=(2*k*b-2*k*y1-2*x1);cc=-2*b*y1+y1*y1+b*b+x1*x1-r*r;
double deta=calc();
xx=(-bb-sqrt(deta))/(2*aa);
yy=k*xx+b;
}
bool pd()
{
int ans=0;
rrep(i,n){
double dis=(x[i]-xx)*(x[i]-xx)+(y[i]-yy)*(y[i]-yy);
if(dis<=r*r+1e-5)ans++;
}
if(ans>fans)fans=ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lf%d",&r,&n);
if(n==1){scanf("%lf%lf",&x[1],&y[1]);printf("%d\n",1);continue;}
if(n==0){printf("%d\n",0);continue;}
fans=1;
rrep(i,n){
scanf("%lf%lf",&x[i],&y[i]);
}
rrep(i,n)
for(int j=i+1;j<=n;j++)
{
worka(x[i],y[i],x[j],y[j]);
pd();
workb(x[i],y[i],x[j],y[j]);
pd();
}
printf("%d\n",fans);
}
return 0;
}
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#define rep(i,n) for(int i=0;i<n;i++)
#define rrep(i,n) for(int i=1;i<=n;i++)
using namespace std;
int sum[10],ssum[10];
int maxt,maxs;
bool flag;
void searchs(int t)
{
if(t>maxs){flag=1;return;}
rrep(i,7)
if((sum[i]>=1)&&(sum[i+1]>=1)&&(sum[i+2]>=1))
{
sum[i]--;sum[i+1]--;sum[i+2]--;
searchs(t+1);
sum[i]++;sum[i+1]++;sum[i+2]++;
}
}
void searchtr(int t)
{
if(t>maxt){searchs(1);return;}
rrep(i,9)
if((sum[i]==3))
{
sum[i]=0;
searchtr(t+1);
sum[i]=3;
}
}
bool search()
{
rrep(i,9)sum[i]=ssum[i];
// case 1: 4 triples and 0 straights
flag=0;maxt=4;maxs=0;
searchtr(1);
if(flag)return 1;
// case 2: 3 triples and 1 straights
flag=0;maxt=3;maxs=1;
searchtr(1);
if(flag)return 1;
// case 3: 2 triples and 2 straights
flag=0;maxt=2;maxs=2;
searchtr(1);
if(flag)return 1;
// case 4: 1 triples and 3 straights
flag=0;maxt=1;maxs=3;
searchtr(1);
if(flag)return 1;
// case 5: 0 triples and 4 straights
flag=0;maxt=0;maxs=4;
searchtr(1);
if(flag)return 1;
return 0;
}
bool pd()
{
rrep(i,9)
{
if(ssum[i]>=2)
{
ssum[i]-=2;
if(search())return 1;
ssum[i]+=2;
}
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
memset(ssum,0,sizeof(ssum));
rep(i,14)
{
int x;
scanf("%d",&x);
ssum[x]++;
}
if(pd())printf("Vulnerable\n");
else printf("Immune\n");
}
return 0;
}
#include<cstdio>
#include<iostream>
#include<cstring>
#include<string>
#define rep(i,n) for(int i=0;i<n;i++)
#define rrep(i,n) for(int i=1;i<=n;i++)
using namespace std;
const int dx[4]={0,1,-1,0};
const int dy[4]={1,0,0,-1};
char map[110][110];
bool exist[110][110];
int n,m,x,y;
void work(int x,int y)
{
if(map[x][y]!='D'){
switch (map[x][y])
{
case 'A':map[x][y]='B';break;
case 'B':map[x][y]='C';break;
case 'C':map[x][y]='D';break;
}
return;
}
if(!exist[x][y])return ;
exist[x][y]=0;
rep(i,4){
int xx=x+dx[i],yy=y+dy[i];
if((xx<0)||(xx>=n)||(yy<0)||(yy>=m))continue;
if(map[xx][yy]!='X')work(xx,yy);
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&m,&n);
memset(exist,1,sizeof(exist));
rep(i,n)
{
scanf("%s",&map[i]);
}
int tt;
scanf("%d",&tt);
rep(i,tt)
{
scanf("%d%d",&y,&x);
if(map[x][y]!='X'){
memset(exist,1,sizeof(exist));
work(x,y);
}
}
rep(i,n){
printf("%s\n",map[i]);
}
}
return 0;
}
G:
#include<cstdio>
#include<iostream>
#define rrep(i,n) for(int i=1;i<=n;i++)
using namespace std;
int map[55];
int n;
int main()
{
scanf("%d",&n);
while(n--){
rrep(i,20)
scanf("%d",&map[i]);
for(int i=20;i>1;i--)
{
map[i-1]+=map[i]/2;
if(map[i]&1==1)map[i]=1;
else map[i]=0;
}
rrep(i,19)printf("%d ",map[i]);
printf("%d",map[20]);
if(n!=0)printf("\n");
}
return 0;
}