【2019.3.02】ssl初一模拟试题

T1 青蛙跳荷叶

从前,有一个小青蛙决定去荷叶上练习跳跃.现在有n个荷叶排成一排,小青蛙一开始在最左边的荷叶(一号荷叶)上,当然,这个青蛙是很牛X的,可以在任意两个荷叶之间跳跃。
有一天这个青蛙突发奇想,想用一种奇怪的方式完成跳跃练习:
1.它希望每次跳到不同的荷叶上
2.每一次跳的距离不同
当然,作出这个决定是何其的简单,但是跳跃方式是何其的困难……,所以他希望你可以帮他解决这个问题.
下面给出这个问题严格的数学定义,请给出1到n这n个自然数的一个排列a1,a2,a3……an
使得
1:a1=1
2:对于任意的i<>j(1<=i,j<=n-1),有|ai-a(i+1)|<>|aj-a(j+1)|,其中n是给定的

输入输出

输入

一行,一个数n

样例输入

3

输出

一行,n个数,用一个空格隔开,末尾没有多余空格

样例输出

1 3 2

思路

首先要找到了规律,输出是按照 1 , n , 2 , n 1... 1,n,2,n-1...
于是…

代码

#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int n,a;
int main()
{
	scanf("%d",&n);
	 for(int i=1; i<=n-a; ++i)
	  {
	  	if (i!=n-a)//没有到最后是只剩下一个的时候
		 printf("%d %d ",i,n-a),++a;//按规律输出
		 else printf("%d",i);
	  }
	 return 0;
}

数据范围

对于20%的数据,1< n <=4
对于100%的数据,1< n <=10000


T2 排排坐(未完成)

小B喜欢在蓝心网玩游戏,一天他玩到了这个游戏:他感觉非常好玩…于是他就YY出了一个类似的简易模型…
游戏规则:每次点击一个小朋友,他和他的周围的小朋友都会改变状态(蹲下的变成了站起来的,站起来的变成了蹲下的)
我们将这个抽象成如下图所示的1*N的图.对于一个单元格,黑色表示小朋友是站起来的,反之,蹲下的小朋友是是白色的.Source表示初始状态,Target表示目标状态.
在这里插入图片描述
现在小B有点偷懒,希望作为神牛的你帮小B算出初始状态到目标状态的最少点击数.

输入输出

输入

第一行为N表示小朋友的个数.
第二行是初始状态,有N个数,每个数不是0就是1.(0表示小朋友是蹲下的,1表示小朋友是站起来的)
第三行的结构跟第二行类似,表示目标状态

样例输入

9
0 1 0 0 0 1 0 0 0 
1 0 1 0 1 0 1 0 0

输出

一个数X,表示初始状态到目标状态的最少点击数。
如果无法到达目标,则请输出"Boring"

样例输出

2

解释

只需要点击第二个和第六个点即可。

数据范围

对于100%的数据,N<=10


T3 分离与合体(未完成)

经过在机房里数日的切磋,LYD从杜神牛那里学会了分离与合体,出关前,杜神牛给了他一个测试…
杜神牛造了n个区域,它们紧邻着排成了一行,编号1~n。在这每个区域里都放着一把OI界的金钥匙,每一把都有一定的价值,LYD当然想得到它们了。然而杜神牛规定LYD不可以一下子把它们全部拿走,而是每次只可以拿一个。为了尽快的拿到所有的金钥匙,LYD自然就用上了刚学的分离与合体特技。
一开始LYD可以选择从1–n-1的任何一个区域(记为K)进入,进入后LYD会在K区域发生分离,从而分离为两个小LYD。分离完成的同时会有一面墙在K和K+1区域之间升起,从而把1–k和k+1–n阻断为两个独立的区间。然后两个小LYD分别进入1–k和k+1–n,并在各自的区间内任选除了区间末尾区域以外(即1–k-1或k+1–n-1)的任何一个区域再次发生分离,就一共有了4个小小LYD……重复进行以上所叙述的分离,直到每个小LYD发现自己所在的区间只剩下了一个区域,他们就可以抱起自己梦寐以求的OI金钥匙。
  但是LYD不能就这么分成n多个个体存在于世界上,这些小LYD还会再合体,合体的两个小LYD所在的区间中间的墙会消失。合体会获得一定的价值,计算方法是:(合并后所在区间的左右端区域里金钥匙的价值之和) 乘 (之前分离的时候所在区域的金钥匙价值)。
{例如:LYD曾经在1-3区间中的2号区域分离成为1-2和3两个区间,合并时获得的价值就是(1号金钥匙价值+3号价值)*(2号金钥匙价值)。}
LYD请你编程求出最终可以获得的总价值最大是多少。并按照分离阶段从前到后,区域从左向右的顺序,输出发生分离的区域编号 (例如:先打印1分为2的分离区域,然后从左到右打印2分为4的分离区域,然后是4分为8的…) 。
注意:若有多种方案,选择分离区域尽量靠左的方案(也可以理解为输出字典序最小的)。

输入输出

输入

第一行:正整数n (2<=n<=300)
第二行:n个正整数,表示1~n区域里每把金钥匙的价值。
保证答案及运算过程中不超出longint范围。

样例输入

7
1 2 3 4 5 6 7

输出

第一行一个数,即获得的最大价值
第二行按照分离阶段从前到后,区域从左向右的顺序,输出发生分离的区域编号,中间用一个空格隔开,若有多种方案,选择分离区域尽量靠左的方案(也可以理解为输出字典序最小的)。

样例输出

238
1 2 3 4 5 6

数据范围约定

对于%20的数据 N<=10
对于%40的数据 N<=50
对于%100的数据 N<=300 a[i]<=300


T4 TX大战360

2010年11月3日,是一个难忘的日子。 腾讯发布消息:存360则,不留QQ。留QQ,则须卸360。 360则表示360与QQ可以共存。 这也就标志着腾讯与360的大战就此开始!
现在,腾讯与360由于身处异地,非常迫切地想在最短的时间内相遇,然后干一架。但是由于双方的技术员都在努力地编程序想干掉对方,所以他们希望你来帮他们找到一个最好的方案使得相遇的时间最短。
在此我们定义“相遇”为:两个人皆在同一个有编号的城市上就可以了,并且这两个人均可以站在原地等另外一个人。也就是说,在这里我们不考虑两人在路中间相遇。

输入输出

输入

输入数据第一行:N和M(用空格隔开) 表示这是一个N*N的图并且有M条边,第二行到第M+1行 为这个图的详细信息。
每行共有被空格隔开的三个数:a b c。表示编号为a的城市到编号为b的城市
有一个双向边,并且要过这条双向边所需要花费的时间为c。
最后一行有两个数:S和T,S表示腾讯所处的城市(也就是深圳),T表示360所处的 城市(也就是北京)

样例输入

3 3
1 2 1 
2 3 1
1 3 1
1 3

输出

输出只有一行,D,表示二者“相遇”的最短时间。当然,如果无法相遇则输出 P e a c e ! “Peace!”

样例输出

1

数据范围

每组都是n=5000 m=5000 并且保证运算过程中的所有值都不会超过117901063

思路

首先两遍 S P F A SPFA ,分别算出从 s s t t 的最短路和从 t t s s 的最短路,然后在每一个点求一个两条路中的最大值,最后从这些路径中找一个最小值就是答案

代码

#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<iostream>
using namespace std;
int n,m,x,y,t,tot; int maxx[5005],ans;
int h[5005],dis[5005],dis2[5005];
bool b[5005];
struct opp
{
	int w,z,p;
}wh[10005];
int main()
{
	memset(dis2,127/3,sizeof(dis2));
	memset(dis,127/3,sizeof(dis));
	ans=dis[0];
	scanf("%d%d",&n,&m);
	for (int i=1; i<=m; ++i)
	{
		scanf("%d%d%d",&x,&y,&tot);
		wh[++t]=(opp){y,tot,h[x]};h[x]=t;
		wh[++t]=(opp){x,tot,h[y]};h[y]=t;
    }
    int s;
    scanf("%d%d",&s,&t);
    queue<int>l;
	b[s]=1; dis[s]=0;
	l.push(s);
	while (l.size())
	{
		int tt=l.front();
		l.pop();
		for (int i=h[tt];i;i=wh[i].p)
		{
			if (dis[wh[i].w]>dis[tt]+wh[i].z)
			{
				dis[wh[i].w]=dis[tt]+wh[i].z;
				if (!b[wh[i].w])
				{
					l.push(wh[i].w);
					b[wh[i].w]=1;
				}
			}
		}
		b[tt]=0;
	}//第一遍SPFA
	memset(b,0,sizeof(b));
	queue<int>l2;
	dis2[t]=0; b[t]=1;
	l2.push(t);
	while (l2.size())
	{
		int tt=l2.front();
		l2.pop();
		for (int i=h[tt];i;i=wh[i].p)
		{
			if (dis2[wh[i].w]>dis2[tt]+wh[i].z)
			{
				dis2[wh[i].w]=dis2[tt]+wh[i].z;
				if (!b[wh[i].w])
				{
					l2.push(wh[i].w);
					b[wh[i].w]=1;
				}
			}
		}
		b[tt]=0;
	}//第二遍SPFA
	ans=117901063;
	for (int i=1; i<=n; ++i)
	 ans=min(ans,max(dis[i],dis2[i]));//求答案
	if (ans==117901063) printf("Peace!");
	 else printf("%d",ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/LTH060226/article/details/88077811