A.取石子
将数据特判一下,递归求解。
#include<iostream>
using namespace std;
int a,b;
bool f;
void s() {
f=!f;
if(a==b||a/b>=2||b/a>=2) {
return;
}
a>b?a-=b:b-=a;
s();
}
int main() {
while(cin>>a>>b) {
if(a==0&&b==0) {
break;
}
if(a==0||b==0) {
cout<<"win"<<endl;
continue;
}
f=false;
s();
if(f) {
cout<<"win"<<endl;
} else {
cout<<"lose"<<endl;
}
}
return 0;
}
B.骑行
套用数学公式,并且出发时间为负数的不管他,反正追不上。找最快的。
#include <iostream>
using namespace std;
int n,ans,v,t;
int main() {
while(cin>>n) {
if(n==0) {
break;
}
ans=0xfffffff;
for(int i=1 ; i<=n; i++) {
cin>>v>>t;
if(t<0) {
continue;
}
int f=(16200.0/(double)v)+t+0.99;
ans=min(f,ans);
}
cout<<ans<<endl;
}
return 0;
}
C.拯救行动
经典的宽搜,加一个杀掉守卫的if就行了。
#include <iostream>
#include <cstring>
using namespace std;
int n,m,ax,ay,bx,by,f,minn,v[210][210],q[40100][3],dx[4]= {-1,1,0,0},dy[4]= {0,0,-1,1},t;
char map[210][210];
void bfs(int x,int y,int l) {
int head=0,tail=1;
q[tail][0]=x;
q[tail][1]=y;
q[tail][2]=l;
v[x][y]=1;
while(head!=tail) {
head++;
x=q[head][0];
y=q[head][1];
l=q[head][2];
v[x][y]=1;
if(x==bx&&y==by) {
minn=l;
break;
}
if(map[x][y]=='x') {
tail++;
map[x][y]='@';
q[tail][0]=x;
q[tail][1]=y;
q[tail][2]=l+1;
} else {
for(int i=0; i<4; i++) {
int nx=x+dx[i];
int ny=y+dy[i];
if(nx>=1&&nx<=n&&ny>=1&&ny<=m&&map[nx][ny]!='#'&&v[nx][ny]==0) {
tail++;
q[tail][0]=nx;
q[tail][1]=ny;
q[tail][2]=l+1;
v[nx][ny]=1;
}
}
}
}
}
int main() {
cin>>t;
while(t--) {
minn=0;
memset(map,'#',sizeof(map));
memset(v,0,sizeof(v));
cin>>n>>m;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin>>map[i][j];
if(map[i][j]=='r') {
ax=i;
ay=j;
}
if(map[i][j]=='a') {
bx=i;
by=j;
}
}
}
bfs(ax,ay,0);
if(minn) {
cout<<minn<<endl;
} else {
cout<<"Impossible"<<endl;
}
}
return 0;
}
D.阶梯电价
直接枚举u、v之间的数,几个if判断就行了。
#include <iostream>
using namespace std;
int u,v;
double ans;
int main() {
cin>>u>>v;
for(int i=u+1; i<=v; i++) {
if(i<=2760) {
ans+=0.52;
} else if(i>2760&&i<=4800) {
ans+=0.57;
} else if(i>4800) {
ans+=0.82;
}
}
printf("%.2f",ans);
return 0;
}
这是本蒟蒻第一次写题解,望大家支持!如果大佬们有宝贵意见,请在评论区留言。