Codeforces Round #124 (Div. 2)

来源:互联网 发布:用c语言打印出杨辉三角 编辑:程序博客网 时间:2024/05/16 14:04

转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove


A:博弈问题,一个矩形中,放入半径等于r的圆,谁不能放,就输了。

一开始比较茫然,仔细想一下发现有对称性质,一开始在中心放入一个圆,便将矩形分为对称区域,对手放入一个圆,则自己可以在对称的区域相同的位置放入圆。

#include<iostream>#include<cstring>#include<queue>#include<string>#include<cstdio>#include<vector>#include<algorithm>#include<stack>#define N 105using namespace std;int main(){    int a,b,r;    while(scanf("%d%d%d",&a,&b,&r)!=EOF){         if(2*r>a||2*r>b)             printf("Second\n");         else             printf("First\n");    }    return 0;}


B:取极限问题,比较简单,想清楚所有的情况就OK了

#include<iostream>#include<cstring>#include<queue>#include<string>#include<cstdio>#include<algorithm>#define N 105using namespace std;int gcd(int a,int b){    return b==0?a:gcd(b,a%b);}int main(){    int n,m;    int a[105],b[105];    while(scanf("%d%d",&n,&m)!=EOF){         for(int i=0;i<=n;i++)         scanf("%d",&a[i]);         for(int j=0;j<=m;j++)         scanf("%d",&b[j]);         if(n==m){             if(a[0]*b[0]<0)                 printf("-");             printf("%d/%d\n",abs(a[0])/gcd(abs(a[0]),abs(b[0])),abs(b[0])/gcd(abs(a[0]),abs(b[0])));         }         else if(n>m){              if(a[0]*b[0]<0)                 printf("-");              printf("Infinity\n");         }         else             printf("0/1\n");    }    return 0;}


C:选出字典序最大的子序列,维护一个单调栈就OK了

#include<iostream>#include<cstring>#include<queue>#include<string>#include<cstdio>#include<vector>#include<algorithm>#include<stack>#define N 105using namespace std;char str[200005];stack<char>s,ans;int main(){    while(scanf("%s",str)!=EOF){        while(!s.empty())            s.pop();        while(!ans.empty())            ans.pop();        int len=strlen(str);        for(int i=0;i<len;i++){            if(s.empty())                s.push(str[i]);            else{                 if(str[i]<=s.top())                      s.push(str[i]);                 else{                      while(1){                          if(s.empty())                              break;                          if(str[i]>s.top())                              s.pop();                          else                              break;                      }                      s.push(str[i]);                 }            }        }            while(!s.empty()){            ans.push(s.top());            s.pop();        }        while(!ans.empty()){            printf("%c",ans.top());            ans.pop();        }        printf("\n");            }    return 0;}


D:一个无限大的地图,问是否能无限走下去。

对于每一个位置,如果可以从多个位置到达,则说明进入了循环,便将是可以无限移动的。

#include<iostream>#include<iomanip>#include<cstdio>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath>#include<map>#include<set>#include<queue>#include<string>#include<vector>#define eps 1e-10#define LL long long#define LD long double#define pi acos(-1.0)using namespace std;struct Node{int x,y;}s,u,v,tt;int n,m;int way[4][2]={{0,1},{0,-1},{1,0},{-1,0}};bool flag[1505][1505];int vis[1505][1505][2];char str[1505][1505];bool bfs(){queue<Node>que;que.push(s);memset(flag,false,sizeof(flag));while(!que.empty()){u=que.front();que.pop();for(int i=0;i<4;i++){v=u;v.x+=way[i][0];v.y+=way[i][1];tt.x=((v.x%n)+n)%n;tt.y=((v.y%m)+m)%m;if(str[tt.x][tt.y]=='#')continue;if(flag[tt.x][tt.y]){if(v.x!=vis[tt.x][tt.y][0]||v.y!=vis[tt.x][tt.y][1])return true;}else{flag[tt.x][tt.y]=true;vis[tt.x][tt.y][0]=v.x;vis[tt.x][tt.y][1]=v.y;que.push(v);}}}return false;}int main(){while(scanf("%d%d",&n,&m)!=EOF){for(int i=0;i<n;i++){scanf("%s",str[i]);for(int j=0;j<m;j++)if(str[i][j]=='S'){s.x=i;s.y=j;}}printf("%s\n",bfs()?"YES":"NO");}return 0;}

E:构造???还没搞定,待更新。

原创粉丝点击