Codeforces Round #328 (Div. 2)

来源:互联网 发布:学会python要多久 编辑:程序博客网 时间:2024/05/01 13:19

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


B. The Monster and the Squirrel

【题意】凸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\n",total/a,t/a);}
改了很多次才A,有的是不知道哪里的问题,有的是知道哪里错了就是改不对。。。哭哭。。。

盲忙茫,知道差太多可是又不知道怎么正确的努力。也就,坚持吧。。。。。


先写三道。

0 0
原创粉丝点击