Codeforces Round #328 (Div. 2)

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
",total/a,t/a);

}
改了很多次才A,有的是不知道哪里的问题,有的是知道哪里错了就是改不对。。。哭哭。。。

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


先写三道。

原文地址:https://www.cnblogs.com/Tuesdayzz/p/5758886.html