暑假集训前的第一次考试(2018.7.4)

因为部分字符是图片所以空着请谅解

                  猜数游戏(number)     

今天你交到了一个新的friend, 他想要考考你。
于是他把自己的电话号码写成了一系列的英文单词,
比如说012就写成了ZEROONETWO
然后,他干了一件很恶趣味的事,那就是把这个字符串 打ꞏ乱ꞏ了
比如上面的字符串可能就变成OWTZEOORNE
他想要考考你你能不能从这个打乱的字符串 还原出原来的电话号码
正常情况下这当然是不可能的,不过他给了你一个提示,你能够确定的是,它的电话号码是不降的,也就是说,只 会有001122这样的号码,而不会有010122这样的号码
题目数据保证有唯一解
输入格式  
输入一行一个字符串,只包含大写字母
字符串由以下单词拼接并打乱而成,ZERO, ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE
输出格式  
输出一行字符串,表示还原的电话号码,题目保证每个输入都有唯一的解
数据规模及约定  
对于  的数据 
对于  的数据 
样例输入  
OZONETOWER
WEIGHFOXTOURIST
OURNEONFOE
ETHER
样例输出  
012
2468
114
3     

这道题目就是先通过一些某个字符只有它有来确定其的个数,一个一个确定下来

#include
using namespace std;
int main()
{
	freopen("number.in","r",stdin);
	freopen("number.out","w",stdout);
	string a;
	cin>>a;
	int l=a.size();
	int s[300]={},shu[10]={};
	for(int i=0;i

暴力快递 (express)  
题目描述  
有家快递公司向来以暴力出名,比如他们一般是靠丢来把一个包裹从地上搬到车上的。
不过暴力快递对员工的体能消耗也是很严重的,他们的老板希望找到一个折衷的方案。
具体来说,现在有 个快递员,编号从 到 ,其中第 个快递员就在车上负责装车所以他是不动的。
每个人在高为 宽为 的区域的某个位置,以坐标 来记,每快递员可以干以下 件事情:
1. 选择前后左右四个方向之一,把快递往那个方向丢 米( 是正数),若如此做,他的疲劳值增加 . 2. 选择一个方向,移动 米,若如此做,它的疲劳值增加 3. 把包裹放下 4. 如果地上有包裹,捡起包裹
一开始包裹在编号 的快递员手里,只有手里有快递的快递员可以做1. 和3.,所有快递员都可以做2. 和4.
快递员可以重叠
你希望让快递员疲劳值之和尽可能小
输入格式  
第一行输入两个整数 和
第二行输入 个整数
第三行输入一个整数 表示快递员的个数
接下来 行每行两个整数 表示这个快递员所在的位置
数据规模及约定  
对于 的数据
对于 的数据
对于另外 的数据
样例输入  
6 5  1 3 6  3  1 1  0 4  6 5
3 3  0 50 10  2  0 0  3 3
4 3  0 15 10  2  0 0  4 3
4 6  0 5 1000  6  3 1  4 6  3 0  3 0  4 0  0 4
样例输出  
26
60
45
2020
提示  

本题时间限制3秒

这题讲的人没有讲好清楚

据说是SPFA

因为一个人传到另个人最多丢一次,要么走x要么走y

传了之后就没他事了。


超越光速(ftl)  
题目描述  
宇宙大国F国通过亚空间通道连接分散在宇宙各处的殖民地。
具体来说就是从编号星球 出发,一直到编号 的星球。而这条通道上运行有两种不同的超光速飞船。
一种是在帝国的每个殖民地都停船上下客的慢速飞船,对它来说从站点 进入超光速到达站点 需要花费 分钟。
另一种是快速飞船,它只在其中 个星球停泊,分别是 . 这种飞船从星球 航行到站点 需要花费 分钟。
为了提高帝国交通系统地运行效率,也就是从 号站点出发,坐不超过 分钟的飞船(任意一种),能到达的城市数 量(不包括 号)尽可能多。 F国决定启用一种新型飞船,它的运行速度是 . 现在大家在正考虑这种飞船要在哪些 站点经停,目前的要求是这样的:
1. 之前的快速飞船经停的站点,新的飞船也必须要停 2. 这种飞船必须在恰好 个站点经停
因为是超光速飞船,任意时刻乘客都可以在某个站点搭乘自己想要坐上的飞船,这个时间可以忽略不计。也就是 说,乘客可以在某个星球下船,然后瞬间换乘到经过这个星球的另一种速度船上。
交通部门想要知道,为了使得航线线路的运行效率最高,新型飞船的最佳的站点设置是什么样的。
注意,这里的航行是从星球 到星球 , 哪怕他不在这颗星球停下来,路过他也是要花时间的
输入格式  
第一行输入三个整数 . 代表F国一共 个星球, 快速飞船停泊的站点数量 ,以及中速飞船规划中的站点数量 .
第二行输入三个整数 表示三种船经过一站需要的时间。
第三行包含一个整数 , 做不超过 分钟的飞船(任意一种),从 号星球能到达的星球数量(不包括 号)尽可能 多。
接下来 行,每行一个整数 表示快速飞船经停的站点 .
输出格式  
输出一个整数,表示在 分钟内能到达的最多的站点数量(不包括1号站点)。
数据规模及约定  
对于 的数据,
对于 的数据,
对于另外 的数据
样例输入  
10 3 5  10 3 5  30  1  6  10
10 3 5  10 3 5  25  1  6  10
90 10 12  100000 1000 10000  10000  1  10  20  30  40  50  60  70  80  90
12 3 4  10 1 2  30  1  11  12
300 8 16  345678901 123456789 234567890  12345678901  1  10  77  82  137  210  297  300
1000000000 2 3000  1000000000 1 2  1000000000  1  1000000000
样例输出  
8
7
2
8
72
3000
样例1的解释  
除了 号星球都可以在 分钟内到达
快速飞船能到达1 6 10, 因为快速飞船的速度是 , 这三个目的地都可以在 的时间内到达
令新型飞船停靠1 5 6 8 10
对于站点 可以直接慢速前进
对于站点 , 可以做快速飞船到 ,再坐 分钟慢速到达,一共 分钟
对于站点 , 可以做快速飞船到 ,再做 分钟新型飞船到达,一共也是 分钟
对于站点 , 我们到不了
这样2 3 4 5 6 7 8 10都可以到达

一共是 个站点


这一题用贪心

因为之前没有看到解释一直误解题意

先考虑直接坐慢的能坐到哪

因为快的直接到它自己的一个站点节约时间

到一个快的能直接到的一个站点

再考虑快的在相邻两个站点去掉之前的时间在通过慢的能到哪

因为中的必须要包括快的站点,所以自由的只有中的减快的

在再该快的两点的慢的能道达的最远位置设置中的站点

这样就能在该种情况下让增加的能到的站点便得尽可能地多

再把每两点的情况都遍历出来

选出最优的算出最后可以的站点就好了

还有个是在两个快的之间如果有多个中的,增加的站点是依次递增的

所以前面的一定比后面的先

所以可以直接把每个设置的中的增加的到的数量入堆到时候依次输出就可以了

完全不可靠的代码只是我的大致思路 

#include
using namespace std;
#define C getchar()-48
#define ll long long
inline long long read()
{
    long long dr=0,zf=1,k=getchar()-48;
  for (;k<0||k>9;k=getchar()-48) if (k==-3) zf=-1;
  for (;k>=0&&k<=9;k=getchar()-48) dr=(dr<<1)+(dr<<3)+k;
  return dr*zf;
}

ll n,m,k,a,b,c,t,s[100000010];
int main()
{
	
	
	
	//输入 
	n=read();m=read();k=read();//星球 快 中 站点 数 
	a=read();b=read();c=read();//各时间 
	t=read();//总时间 
	for(int i=1;i<=m;i++)
	   s[i]=read();     //快站点 
	   
	   
	//预处理出刚开始满不能直接到达的快的   
	ll cc=t/a+1,x,maxj,dq,lj=0;//cc慢的直接到达最远 maxj不算快的和满的最多增加 dq 当前站点 lj累计用的中的 
	for(int i=1;i<=m;i++)  
	   if(s[i]>=cc)
	   {
	   	  x=i;
	   	  break;
	   }
	maxj+=m-x+1;//慢快总共能直接到达的站点 
	
	
    priority_queue, greater >q;//处理每个增加的站点 
    
    
    //work 
	for(int i=x;i<=m;i++)
	{	
		ll jj=(s[i-1]-1)*b,qjj; //jj用快的前面用的时间 qjj前个中的
		lj=0;//lj累计用的中的 
	 	qjj=s[i-1];//前个中的 
	 	dq=qjj+(t-jj)/a;//当前站点 
		while(dq0||lj>=k-m)//前个最后的站点不能超过  增加中的必须要有  用的中的不超过自由的中的 
     	{
		 	lj++;//用的中的 
		 	jj+=(dq+1-(qjj))*c;//换中的全部用的时间 
	 		qjj=dq+1;//前个中的 
		 	int jjj=(t-jj)/a;  //增加的站点 
		 	dq+=jjj;//当前站点 
		 	if(dq0||lj>=k-m)//前个最后的站点不能超过  增加中的必须要有  用的中的不超过自由的中的 
     	{
		 	lj++;//用的中的 
		 	jj+=(dq+1-(qjj))*c;//换中的全部用的时间 
	 		qjj=dq+1;//前个中的 
		 	int jjj=(t-jj)/a;  //增加的站点 
		 	dq+=jjj;//当前站点 
		 	if(dq


你可能感兴趣的:(暑假集训前的第一次考试(2018.7.4))