The 12th UESTC Programming Contest Warmup #1

来源:互联网 发布:定义学生数组java 编辑:程序博客网 时间:2024/06/14 22:25

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;}



E:

#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;}


F:

#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;}



0 0
原创粉丝点击