L(chess)

【题目描述】

    BBS喜欢和LGH下棋,因为这样能增长他的LG技巧。今天他们又开始下棋。BBS想知道,以当前的局势,如果双方都以最优策略下棋,那么谁能获得胜利呢?毕竟如果这局会输,就可以马上用LFF清理大师清理桌面以保持他的100%的胜率。

    棋盘是一个8*8的方格。BBS执白,棋子用’W’表示;LGH执黑,棋子用’B’表示。规则是这样的:棋盘上为’.’的位置是空格。对于BBS来说,如果他有一个棋子在(r,c)的位置且(r-1,c)的位置为空格,那么他可以将这个棋子移到(r-1,c)的位置,如果他将任意一个棋子移到了(1,c),那么他将立即获得胜利。对于LGH来说,如果他有一个棋子在(r,c)的位置且(r+1,c)的位置为空格,那么他可以将这个棋子移到(r+1,c)的位置,如果他将任意一个棋子移到了(8,c),那么他将立即获得胜利。由于BBS非常的B,所以总是他先手移动一个棋子,然后交换移动权。现在给你整个棋盘,请你输出这局的结果。

【输入描述】

    输入一个8*8的棋盘,由’W’,’B’或’.’组成。保证此时第一行没有W,第八行没有B。

【输出描述】

    如果这盘BBS能赢,请输出”BBS”;如果这盘LGH能赢,请输出”LGH”。

【样例】

输入1

输出1

........

........

.B....B.

....W...

........

..W.....

........

........

BBS

输入2

输出2

..B.....

..W.....

......B.

........

.....W..

......B.

........

........

LGH

【说明】

    本题中,每10%的数据包括5个点,只有通过全部的5个点才能获得这10%的分数。

 

大水题,随便打。

#include<cstdio>
#include<iostream>
using namespace std;
char a[10][10];
int w=10,b=10;
int main()
{
    //freopen("chess.in","r",stdin);
    //freopen("chess.out","w",stdout);
    for(int i=1;i<=8;i++)scanf("%s",a[i]);
    for(int j=1;j<=8;j++){
        int tmp=10;
        for(int i=1;i<=8;i++){
            if(a[i][j-1]!='.'){
                if(a[i][j-1]=='W')tmp=i-1;
                break;
            }
        }
        if(w>tmp)w=tmp;
    }
    for(int j=1;j<=8;j++){
        int tmp=10;
        for(int i=8;i>=1;i--){
            if(a[i][j-1]!='.'){
                if(a[i][j-1]=='B')tmp=8-i;
                break;
            }
        }
        if(b>tmp)b=tmp;
    }
    if(w==10&&b==10)return 0;
    if(w<=b)puts("BBS");
    else puts("LGH");
    return 0;
}
View Code

G(tree)

【题目描述】

    BBS有一个n个点的树,现在告诉你这n-1条边两端的点,由于他非常B,所以希望你能帮他把这棵树放到平面直角坐标系上,并满足以下条件,要不然BBS的强迫症会发作:

  1. 不B不行:每个点的坐标必须为整点,即x,y均为整数。同时点的坐标两两不同且坐标绝对值小于10^18。
  2. 不B不行:每条树边都必须平行于x轴或y轴。
  3. 不S不行:不能有任意两条树边在非树点处相交。

【输入描述】

第一行为一个整数n,表示树点的数量。

接下来的n-1行,每行两个整数p[i]和q[i],表示点p[i]和点q[i]有连边。

【输出描述】

    第一行输出”YES”或”NO”。如果能将这棵树放到平面直角坐标系上且满足所以条件,输出”YES”,否则输出”NO”。

    如果第一行输出”YES”,那么接下来的n行,每行输出两个整数x[i],y[i],表示点i的坐标为(x[i],y[i])。

    如果有多种解,允许输出任意一种。

【样例】

输入

输出

7

1 2

1 3

2 4

2 5

3 6

3 7

YES

0 0

1 0

0 1

2 0

1 -1

-1 1

0 2

【数据范围】

对于100%的数据,1<=n<=30

本题中,每10%的数据包括6个点,只有通过全部的6个点才能获得这10%的分数。

 

就是一题构造题,只要每一个分支的长度是父节点分支的1/2就可以了。

#include<cstdio>
#include<vector>
#include<iostream>
#define ll long long
using namespace std;
vector<int> g[31];
ll ax[31],ay[31];
const int tx[4]={0,0,-1,1};//上下左右 
const int ty[4]={-1,1,0,0};
void dfs(int x,int f,int la,ll d){
    int now=0;
    for(int i=0;i<g[x].size();i++){
        int y=g[x][i];if(y==f)continue;
        if(now==la)now++;
        ax[y]=ax[x]+tx[now]*d;
        ay[y]=ay[x]+ty[now]*d;
        dfs(y,x,now^1,d>>1);
        now++;
    }
}
int main()
{
    int n;scanf("%d",&n);
    for(int i=1;i<n;i++){
        int x,y;scanf("%d%d",&x,&y);
        g[x].push_back(y);
        g[y].push_back(x);
    }
    for(int i=1;i<=n;i++)if(g[i].size()>4)
        {puts("NO");return 0;}
    ax[1]=ay[1]=0;dfs(1,-1,-1,1<<30);
    puts("YES");
    for(int i=1;i<=n;i++)
        printf("%lld %lld\n",ax[i],ay[i]);
    return 0;
}
View Code

B(journey)

【题目描述】

    BBS作为一名老司机,最喜欢的自然不过开车。今天他新进口了一辆“涡轮喷压”车,可以在助跑至少s个单位后在空中飞至多d个单位。本来开车是一件很开心的事,从石头上飞过去也是件很开心的事,可是两件事在一起……怎么会这样呢?瀚嵩现在在0的位置,他要开到m的位置,在这段路上有n块石头,现在他知道这n块石头的位置,他想请教你要如何开车才能经过这一段路?

【输入描述】

    第一行有四个数,分别是n,m,s,d

第二行为n个数,是n个石头的位置w[1],w[2]…w[n]

【输出描述】

    输出有若干行,为你开车的过程,每个过程一行,方法有两种:

 

1、“RUN X”这个表示在地上开X个单位长度,不能有两个连续的RUN命令

2、“JUMP X”这个表示在空中飞X个单位长度,这个命令的前一个操作要求要助跑距离超过s,飞的长度不超过d

 

如果有多种过程能到达终点,允许输出任意一种。

如果不能到达终点,输出“Impossible”

【样例】

输入

输出

3 10 1 3

3 4 7

RUN 2
JUMP 3
RUN 1
JUMP 2
RUN 2

【样例解释】

 

【数据范围】

对于40%的数据,n<=10并捆绑测试

对于70%的数据,n<=100000

对于100%的数据,

1<=n<=200000,2<=m<=10^9,1<=s,d<=10^9,1<=w[i]<=m-1,w[i]<w[i+1]

X为1到10^9内的整数

 

啊啊

简直就是细节题,直接模拟。。

注意的是存答案的数组要开2倍大。不然。。。Runtime Error

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int w[200010],g[400010][2];
int n,m,s,d,cnt=0,t;
inline int read(){
    int x=0;char c=getchar();
    while(c>'9'||c<'0')c=getchar();
    while(c<='9'&&c>='0'){x=x*10+c-'0';c=getchar();}
    return x;
}
int main()
{
    n=read();m=read();s=read();d=read();
    for(int i=1;i<=n;i++)w[i]=read();
    w[n+1]=w[n]+1000000;
    if(w[1]-1<s||d==1){puts("Impossible");return 0;}
    else{g[++cnt][1]=1;g[cnt][2]=w[1]-1;t=w[1]-1;}
    for(int i=2;i<=n+1;i++){
        int a=w[i]-w[i-1]-2;
        if(a>=s){
            g[++cnt][1]=0;g[cnt][2]=w[i-1]+1-t;
            g[++cnt][1]=1;g[cnt][2]=a;t=w[i]-1;
        }
        else if(w[i]>=t+d){puts("Impossible");return 0;}
    }
    for(int i=1;i<cnt;i++){
        printf(g[i][1]?"RUN":"JUMP");
        printf(" %d\n",g[i][2]);
    }
    if(w[n]+1<m)printf("RUN %d\n",m-w[n]-1);
    return 0;
}
View Code

本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

posted on 2017-11-21 21:29  Yzyet  阅读(173)  评论(0编辑  收藏  举报