当前位置:编程学习 > C/C++ >>

Codeforces Round #124 (Div. 2)

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 易做图(int a,int b){ 
    return b==0?a:易做图(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])/易做图(abs(a[0]),abs(b[0])),abs(b[0])/易做图(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; 
补充:软件开发 , C++ ,

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,