Codeforces Round #124 (Div. 2)

转载请注明出处,谢谢 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 105
using 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 105
using 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 105
using 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:构造???还没搞定,待更新。

你可能感兴趣的:(codeforces)