A. PawnChess
【题意】8*8网格,(x,y)表示第x行第y列,白色棋子('W')只能向上移动,黑色棋子(’B‘)只能向下移动,‘.'表示为空。若白色棋子通过向上移动(x-1,y)先到第一行,则A赢,黑色棋子通过向下移动(x+1,y)先到第八行,则B赢。给定方格中各个棋子的位置,求A,B谁赢?
【分析】用数组分别保存白色和黑色棋子的横纵坐标,对横坐标进行加减,并判断下一格是否可走。
【代码】
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <set> #include <map> #include <algorithm> #include <stack> #include <queue> #include <cmath> #include<ctime> using namespace std; const int mod=int(1e9)+7,INF=0x3fffffff,maxn=1e5+40; char p[10][10]; int rw[100]; int cw[100]; int rb[100]; int cb[100]; int main (void) { int resultA=maxn,resultB=maxn; int k=0,m=0; for(int i=0;i<8;i++) { for(int j=0;j<8;j++) { cin>>p[i][j]; if(p[i][j]=='W') { rw[k]=i; cw[k]=j; k++; } else if(p[i][j]=='B') { rb[m]=i; cb[m]=j; m++; } } } for(int i=0;i<k;i++) { for(int T=rw[i]-1;T>=0;T--) { if(p[T][cw[i]]!='.') break; if(T==0) resultA=min(resultA,rw[i]); } } for(int i=0;i<m;i++) { for(int T=rb[i]+1;T<8;T++) { if(p[T][cb[i]]!='.') break; if(T==7) resultB=min(resultB,7-rb[i]); } } if(resultA>resultB) cout<<"B"<<endl; else cout<<"A"<<endl; }
【题意】凸n边形,以每个角为起点画射线,遇到另一个角或者线停止,求这些线将凸n边形分成几个部分。
【分析】将凸n边形各个角编号1~n,将编号为1的角与其余各角相连,则多边形被分成n-2个三角形,将i,i+1与其余各个角相连,则编号为1,i,i+1构成的三角形被分成了(n-i)+(i-2)=n-2个三角形,整个凸边形被分成共(n-2)*(n-2)个三角形。由于各个三角形总有公共边或公共角,故松鼠跳(n-2)*(n-2)下就可以吃到所有三角形里的所有核桃。
【代码】
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <set> #include <map> #include <algorithm> #include <stack> #include <queue> #include <cmath> using namespace std; const int mod=int(1e9)+7,INF=0x3fffffff,maxn=1e5+40; int main (void) { long long n; cin>>n; cout<<(n-2)*(n-2); }
C. The Big Race
【题意】读题读了好久.....给定最大数t,求[1,t]区间内使b,w同余的数的个数total,输出total/t,以最简分数形式表示。
【分析】求出w,b最小公倍数lcm,求出n=t/lcm,便已经有了n*min(w,b)个使b,w同余的数,再加上min(t%lcm,min(w-1,b-1)),即为所求。
【代码】
#include <iostream> #include <cstdio> #include <cstring> #include <vector> #include <set> #include <map> #include <algorithm> #include <stack> #include <queue> #include <cmath> #include<ctime> using namespace std; const int mod=int(1e9)+7,INF=0x3fffffff,maxn=1e5+40; typedef long long ll; ll gcd(ll a, ll b) { return b==0?a:gcd(b,a%b); } int main (void) { ll t,w,b,m,total=0; scanf("%I64d%I64d%I64d",&t,&w,&b); ll Min=min(w,b); ll g=gcd(w,b); ll lcm=0; if(t/w >= b/g) { lcm = b/g*w; total= t/lcm *Min+ min(t%lcm,Min-1); } else total=min(t,Min-1); ll a=gcd(total,t); printf("%I64d/%I64d ",total/a,t/a); }改了很多次才A,有的是不知道哪里的问题,有的是知道哪里错了就是改不对。。。哭哭。。。
盲忙茫,知道差太多可是又不知道怎么正确的努力。也就,坚持吧。。。。。
先写三道。