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