程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Codeforces Round #124 (Div. 2)

Codeforces Round #124 (Div. 2)

編輯:C++入門知識

A:博弈問題,一個矩形中,放入半徑等於r的圓,誰不能放,就輸了。
一開始比較茫然,仔細想一下發現有對稱性質,一開始在中心放入一個圓,便將矩形分為對稱區域,對手放入一個圓,則自己可以在對稱的區域相同的位置放入圓。
[cpp] 
#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了
[cpp] 
#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了
[cpp] 
#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:一個無限大的地圖,問是否能無限走下去。
對於每一個位置,如果可以從多個位置到達,則說明進入了循環,便將是可以無限移動的。
[cpp]
#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();   www.2cto.com
        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; 


作者:ACM_cxlove

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved