NOIP2016提高组 day1

1.玩具谜题

题目描述
小南有一套可爱的玩具小人, 它们各有不同的职业。

有一天, 这些玩具小人把小南的眼镜藏了起来。 小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:
在这里插入图片描述
这时 s i n g e r singer singer告诉小南一个谜題: “眼镜藏在我左数第3个玩具小人的右数第 1 1 1个玩具小人的左数第 2 2 2个玩具小人那里。 ”

小南发现, 这个谜题中玩具小人的朝向非常关键, 因为朝内和朝外的玩具小人的左右方向是相反的: 面朝圈内的玩具小人, 它的左边是顺时针方向, 右边是逆时针方向; 而面向圈外的玩具小人, 它的左边是逆时针方向, 右边是顺时针方向。

小南一边艰难地辨认着玩具小人, 一边数着:

s i n g e r singer singer朝内, 左数第 3 3 3个是 a r c h e r archer archer

a r c h e r archer archer朝外,右数第 1 1 1个是 t h i n k e r thinker thinker

t h i n k e r thinker thinker朝外, 左数第 2 2 2个是 w r i t e r writer writer

所以眼镜藏在 w r i t e r writer writer这里!

虽然成功找回了眼镜, 但小南并没有放心。 如果下次有更多的玩具小人藏他的眼镜, 或是谜題的长度更长, 他可能就无法找到眼镜了 。 所以小南希望你写程序帮他解决类似的谜題。 这样的谜題具体可以描述为:

n n n个玩具小人围成一圈, 已知它们的职业和朝向。现在第 1 1 1个玩具小人告诉小南一个包含 m m m条指令的谜題, 其中第 z z z条指令形如“左数/右数第 s s s个玩具小人”。你需要输出依次数完这些指令后,到达的玩具小人的职业。

输入格式
输入的第一行包含两个正整数 n n n, m m m,表示玩具小人的个数和指令的条数。

接下来 n n n 行,每行包含一个整数和一个字符串,以逆时针为顺序给出每个玩具小人的朝向和职业。其中 0 0 0 表示朝向圈内, 1 1 1 表示朝向圈外。 保证不会出现其他的数。字符串长度不超过 10 10 10 且仅由小写字母构成,字符串不为空,并且字符串两两不同。整数和字符串之间用一个空格隔开。

接下来 m m m 行,其中第 i i i 行包含两个整数 a i a_i ai, s i s_i si ,表示第 i i i 条指令。若 a i = 0 a_i=0 ai=0,表示向左数 s i s_i si个人;若 a i = 1 a_i=1 ai=1,表示向右数 s i s_i si个人。 保证 a i a_i ai不会出现其他的数, 1 ≤ s i < n 1≤s _i<n 1si<n

输出格式
输出一个字符串,表示从第一个读入的小人开始,依次数完 m m m 条指令后到达的小人的职业。

输入输出样例

输入 #1

7 3
0 singer
0 reader
0 mengbier 
1 thinker
1 archer
0 writer
1 mogician 
0 3
1 1
0 2

输出 #1

writer

输入 #2

10 10
1 C
0 r
0 P
1 d
1 e
1 m
1 t
1 y
1 u
0 V
1 7
1 1
1 4
0 5
0 3
0 1
1 6
1 2
0 8
0 4

输出 #2

y

说明/提示
【样例1说明】

这组数据就是【题目描述】 中提到的例子。

【子任务】

子任务会给出部分测试数据的特点。 如果你在解决题目中遇到了困难, 可以尝试只解决一部分测试数据。

每个测试点的数据规模及特点如下表:

在这里插入图片描述
其中一些简写的列意义如下:

• 全朝内: 若为“√”, 表示该测试点保证所有的玩具小人都朝向圈内;

全左数:若为“√”,表示该测试点保证所有的指令都向左数,即对任意的
1 ≤ z ≤ m , a i = 0 1≤z≤m, a_i=0 1zm,ai=0;

s = 1 s= 1 s=1:若为“√”,表示该测试点保证所有的指令都只数1个,即对任意的
1 ≤ z ≤ m , s i = 1 1≤z≤m,s_i=1 1zm,si=1;

职业长度为 1 1 1 :若为“√”,表示该测试点保证所有玩具小人的职业一定是一个长度为 1 1 1的字符串。

思路
用结构体存储每一个人的编号和职业。一开始从编号1开始,分析可以得到:如果一个人朝内且朝左数,也就是都为 0 0 0 时,那么向顺时针方向传递,同理朝外向右数也是顺时针,也就是都为 1 1 1 时。由于顺时针编号递减,所以顺时针传递公式为: n e x t = ( n o w − p + n ) % n next=(now-p+n)\%n next=(nowp+n)%n。同理逆时针递增,公式为: n e x t = ( n o w + p − n ) % n next=(now+p-n)\%n next=(now+pn)%n
公式有一个弊端,由于模了1个 n n n,所以 n e x t next next有时候会等于 0 0 0,所以加一个特判:当 n e x t = 0 next=0 next=0 时, n e x t = n next=n next=n

AC代码

#include<bits/stdc++.h> //玩具谜题 
using namespace std;
struct data{
	int cx;
	string ch;
}game[100005];
int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	x=x*10+c-'0',c=getchar();
	return x*f; 
}
bool judge(int x,int y){
	if(x-y!=0) return false;
	return true;
}
int main(){
	//freopen("toy.in","r",stdin);
	//freopen("toy.out","w",stdout);
	int n,m,q,p,now=1;
	n=read(),m=read();
	for(int i=1;i<=n;++i) game[i].cx=read(),cin>>game[i].ch;
	for(int i=1;i<=m;++i){
		q=read(),p=read();
		if(judge(game[now].cx,q)) now=(now-p+n)%n;
		else now=(now+p)%n;
		if(!now) now=n;
	}
	cout<<game[now].ch<<endl;
	return 0;
}

2.天天爱跑步

题目描述
小 c 小c c 同学认为跑步非常有趣,于是决定制作一款叫做《天天爱跑步》的游戏。《天天爱跑步》是一个养成类游戏,需要玩家每天按时上线,完成打卡任务。

这个游戏的地图可以看作一一棵包含 n n n 个结点和 n − 1 n−1 n1 条边的树,每条边连接两个结点,且任意两个结点存在一条路径互相可达。树上结点编号为从 1 1 1 n n n 的连续正整数。

现在有 m m m 个玩家,第 i i i 个玩家的起点为 s i s_i si,终点为 t i t_i ti 。每天打卡任务开始时,所有玩家在第 0 0 0 秒同时从自己的起点出发,以每秒跑一条边的速度,不间断地沿着最短路径向着自己的终点跑去,跑到终点后该玩家就算完成了打卡任务。 (由于地图是一棵树,所以每个人的路径是唯一的)

小 c 小c c 想知道游戏的活跃度,所以在每个结点上都放置了一个观察员。在结点 jj 的观察员会选择在第 w j w_j wj秒观察玩家,一个玩家能被这个观察员观察到当且仅当该玩家在第 w j w_j wj 秒也正好到达了结点 j j j 小 c 小c c 想知道每个观察员会观察到多少人?

注意:我们认为一个玩家到达自己的终点后该玩家就会结束游戏,他不能等待一 段时间后再被观察员观察到。 即对于把结点 j j j 作为终点的玩家:若他在第 w j w_j wj秒前到达终点,则在结点 j j j 的观察员不能观察到该玩家;若他正好在第 w j w_j wj​ 秒到达终点,则在结点 j j j 的观察员可以观察到这个玩家。

输入格式
第一行有两个整数 n n n m m m。其中 n n n 代表树的结点数量, 同时也是观察员的数量, m m m 代表玩家的数量。

接下来 n − 1 n−1 n1 行每行两个整数 u u u v v v,表示结点 u u u 到结点 v v v 有一条边。
接下来一行 n n n 个整数,其中第 j j j 个整数为 w j w_j wj , 表示结点 j j j 出现观察员的时间。

接下来 m m m 行,每行两个整数 s i s_i si,和 t i t_i ti,表示一个玩家的起点和终点。
对于所有的数据,保证 1 ≤ s i , t i ≤ n , 0 ≤ w j ≤ n 1\leq s_i,t_i\leq n, 0\leq w_j\leq n 1si,tin,0wjn

输出格式
输出 1 1 1 n n n 个整数,第 j j j 个整数表示结点 j j j 的观察员可以观察到多少人。

输入输出样例

输入 #1

6 3
2 3
1 2 
1 4 
4 5 
4 6 
0 2 5 1 2 3 
1 5 
1 3 
2 6 

输出 #1

2 0 0 1 1 1 

输入 #2

5 3 
1 2 
2 3 
2 4 
1 5 
0 1 0 3 0 
3 1 
1 4
5 5 

输出 #2

1 2 1 0 1

说明/提示

【样例1说明】
对于 1 1 1 号点, w i = 0 w_i=0 wi=0,故只有起点为 1 1 1 号点的玩家才会被观察到,所以玩家 1 1 1 和玩家 2 2 2 被观察到,共有 2 2 2 人被观察到。

对于 2 2 2 号点,没有玩家在第 2 2 2 秒时在此结点,共 0 0 0 人被观察到。

对于 3 3 3 号点,没有玩家在第 5 5 5 秒时在此结点,共 0 0 0 人被观察到。

对于 4 4 4 号点,玩家 1 1 1 被观察到,共 1 1 1 人被观察到。

对于 5 5 5 号点,玩家 1 1 1 被观察到,共 1 1 1 人被观察到。

对于 6 6 6 号点,玩家 3 3 3 被观察到,共 1 1 1 人被观察到。

【子任务】

每个测试点的数据规模及特点如下表所示。
提示: 数据范围的个位上的数字可以帮助判断是哪一种数据类型。
在这里插入图片描述

3.换教室

题目描述
对于刚上大学的牛牛来说,他面临的第一个问题是如何根据实际情况申请合适的课程。

在可以选择的课程中,有 2 n 2n 2n 节课程安排在 n n n 个时间段上。在第 i ( 1 ≤ i ≤ n ) i(1 \leq i \leq n) i1in个时间段上,两节内容相同的课程同时在不同的地点进行,其中,牛牛预先被安排在教室 c i c_i ci上课,而另一节课程在教室 d i d_i di进行。

在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的 n n n 节安排好的课程。如果学生想更换第 i i i 节课程的教室,则需要提出申请。若申请通过,学生就可以在第 i i i 个时间段去教室 d i d_i di上课,否则仍然在教室 c i c_i ci上课。

由于更换教室的需求太多,申请不一定能获得通过。通过计算,牛牛发现申请更换第 i i i 节课程的教室时,申请被通过的概率是一个已知的实数 k i k_i ki,并且对于不同课程的申请,被通过的概率是互相独立的。

学校规定,所有的申请只能在学期开始前一次性提交,并且每个人只能选择至多 m m m 节课程进行申请。这意味着牛牛必须一次性决定是否申请更换每节课的教室,而不能根据某些课程的申请结果来决定其他课程是否申请;牛牛可以申请自己最希望更换教室的 m m m 门课程,也可以不用完这 m m m 个申请的机会,甚至可以一门课程都不申请。

因为不同的课程可能会被安排在不同的教室进行,所以牛牛需要利用课间时间从一间教室赶到另一间教室。

牛牛所在的大学有 v v v 个教室,有 e e e 条道路。每条道路连接两间教室,并且是可以双向通行的。由于道路的长度和拥堵程度不同,通过不同的道路耗费的体力可能会有所不同。 当第 i ( 1 ≤ i ≤ n − 1 ) i(1 \leq i \leq n-1) i1in1节课结束后,牛牛就会从这节课的教室出发,选择一条耗费体力最少的路径前往下一节课的教室。

现在牛牛想知道,申请哪几门课程可以使他因在教室间移动耗费的体力值的总和的期望值最小,请你帮他求出这个最小值。

输入格式
第一行四个整数 n , m , v , e n,m,v,e n,m,v,e n n n 表示这个学期内的时间段的数量; m m m 表示牛牛最多可以申请更换多少节课程的教室; v v v 表示牛牛学校里教室的数量; e e e 表示牛牛的学校里道路的数量。

第二行 n n n 个正整数,第 i ( 1 ≤ i ≤ n ) i(1 \leq i \leq n) i1in个正整数表示 c i c_i ci,即第 i i i 个时间段牛牛被安排上课的教室;保证 1 ≤ c i ≤ v 1 \le c_i \le v 1civ

第三行 n n n 个正整数,第 i ( 1 ≤ i ≤ n ) i(1 \leq i \leq n) i1in个正整数表示 d i d_i di,即第 i i i 个时间段另一间上同样课程的教室;保证 1 ≤ d i ≤ v 1 \le d_i \le v 1div

第四行 n n n 个实数,第 i ( 1 ≤ i ≤ n ) i(1 \leq i \leq n) i1in个实数表示 k i k_i ki
,即牛牛申请在第 i i i 个时间段更换教室获得通过的概率。保证 0 ≤ k i ≤ 1 0 \le k_i \le1 0ki1

接下来 e e e 行,每行三个正整数 a j , b j , w j a_j, b_j, w_j aj,bj,wj,表示有一条双向道路连接教室 a j , b j a_j, b_j aj,bj,通过这条道路需要耗费的体力值是 w j w_j wj;保证 1 ≤ a j , b j ≤ v 1 \le a_j, b_j \le v 1aj,bjv 1 ≤ w j ≤ 100 1 \le w_j \le 100 1wj100,保证 1 ≤ n ≤ 2000 1 \leq n \leq 2000 1n2000 0 ≤ m ≤ 2000 0 \leq m \leq 2000 0m2000 1 ≤ v ≤ 300 1 \leq v \leq 300 1v300 0 ≤ e ≤ 90000 0 \leq e \leq 90000 0e90000

保证通过学校里的道路,从任何一间教室出发,都能到达其他所有的教室。

保证输入的实数最多包含 3 3 3 位小数。

输出格式
输出一行,包含一个实数,四舍五入精确到小数点后恰好22位,表示答案。你的输出必须和标准输出完全一样才算正确。

测试数据保证四舍五入后的答案和准确答案的差的绝对值不大于 4 × 1 0 − 3 4 \times 10^{-3} 4×103 。(如果你不知道什么是浮点误差,这段话可以理解为:对于大多数的算法,你可以正常地使用浮点数类型而不用对它进行特殊的处理)

输入输出样例

输入 #1

3 2 3 3
2 1 2
1 2 1
0.8 0.2 0.5 
1 2 5
1 3 3
2 3 1

输出 #1

2.80

说明/提示
【样例1说明】

所有可行的申请方案和期望收益如下表:
在这里插入图片描述

【提示】

道路中可能会有多条双向道路连接相同的两间教室。 也有可能有道路两端连接的是同一间教室。
请注意区分n,m,v,e的意义, n不是教室的数量, m不是道路的数量。
在这里插入图片描述
特殊性质1:图上任意两点 a i a_i ai b i b_i bi, a i ≠ b i a_i≠ b_i ai=bi 间,存在一条耗费体力最少的路径只包含一条道路。

特殊性质2:对于所有的 1 ≤ i ≤ n 1≤ i≤ n 1in k i = 1 k_i= 1 ki=1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值