6.7练习赛题解

C题下标打错错90分5555

A.移棋子游戏

问题描述

猫王和老板在玩一个游戏。桌面上一行有n个格子,一些格子中放着棋子。猫王和老板轮流选择如下方式中的一种移动棋子(图示中o表示棋子,*表示空着的格子):
1)当一枚棋子的右边是空格子的话,可以将这枚棋子像右移动一格。
o* -> *o
2)当一枚棋子的右边连续两个都有棋子,并且这个棋子往右边数第3格没有棋子,那么可以将这个棋子往右跳过那两个棋子
*ooo -> **oo
当任何一枚棋子到达最右边的格子时,这枚棋子自动消失。
当一方不能移动时,这方输。假设猫王和老板都采取最优策略,猫王先走,谁将取胜?

输入格式

第一行一个整数T表示数据组数, 0 < T < 10。
之后T组数据,每组两行,
第一行n 表示格子个数,
第二行n个字符表示每个格子的情况,o表示有棋子,*表示空着。

输出格式

对于每组数据一个输出,M表示猫王赢,L表示老板赢。

数据范围

对于50%的数据, n <20。
对于100%的数据, n < 1000。

题解:

显然n的范围不可能暴力搜索(况且还是签到题呢)所以考虑数学方法啦。。。
首先,不管是一格一格地动还是三格三格地动,它都只会跳奇数个格子,所以我们就将每个棋子要跳的距离累加起来,计算它的奇偶性即可。由于猫王先手,显然奇数次跳完棋子他剩;反之老板胜利。

代码:
#include<iostream>
#include<cstdio>
using namespace std;
int sum[1010];
char a[1010];
char read(){
    char c=getchar();
    while(c!='*'&&c!='o')c=getchar();
    return c;
}
int main(){
    int st=0,i,j,t,n,l=1,r=1,k;
    scanf("%d",&t);t++;
    while(--t){
        st=0;
        scanf("%d",&n);
        for(i=1;i<=n;i++)a[i]=read();
        for(i=1;i<=n;i++)if(a[i]=='o')st+=n-i;//累加棋子需要走的距离 
        if(st%2==1)printf("M\n");//奇数猫王赢 
        else printf("L\n");//否则老板赢 
    }
    return 0;
}
B.导航

问题描述

约翰在他的新车上装了两个导航系统(GPS),但这两个GPS选择的导航线路常常不同,约翰很是恼火。
约翰所在的小镇地图由N个路口和M条单向道路构成,两个路口间可能有多条道路相连。约翰的家在1号路口,他的农场在N号路口。约翰从家出发,可以经过一系列的道路,最终到达农场。
两个GPS用的都是上述地图,但是,它们计算时间的算法不同。比如,经过第i条道路,1号GPS计算出的时间是Pi分钟,而2号GPS算出的时间是Qi分钟。
约翰想要驾车从家到农场,但是,如果一个GPS认为约翰当前行走的这条路不在它算出的最短路径中,该GPS就会大声抱怨约翰走错了路(每个GPS会算出所有最短路,只要你在其中一条上最短路上它都不会抱怨)。更倒霉的是,有可能两个GPS会同时抱怨约翰当前走的路不是它们推荐的。
请帮助约翰计算,从家到农场过程中,选择怎样的路径才能使得GPS抱怨的次数最少,请算出这个最少的抱怨次数。如果一条路上两个GPS都在抱怨,算两次(+2)抱怨。

输入格式

第1行两个空格间隔的整数,N和M
接下来M行,每行描述一条道路。第i行描述第i条道路,由四个空格间隔的整数构成,Ai,Bi,Pi,Qi,分别表示该条道路的起点、终点、1号GPS计算的耗时、2号GPS计算的耗时。

输出格式

一个整数,表示所求答案。

数据范围

对于30%的数据,1<=N<=20&

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值