2016年首届南航-河海联合程序设计竞赛暨第十一届南航程序设计竞赛 题解

问题 A: Unhappy sion

时间限制: 1 Sec   内存限制: 128 MB
提交: 335   解决: 153
[ 提交][ 状态][ 讨论版]

题目描述

After 2rd ccpc,UNCLE RAN give sion a task,sion have to set 10 questions for this contest.But as a acm fan,set some questions is not difficult,but UNCLE RAN is too stingy to give money to sion,sion is unhappy now!

To make sion happy again,UNCLE RAN invited sion to have two dinner.

Because of sion in a small mood,sion want to make things difficult,he says,the sum of prices of two dinner must be equal M,UNCLE RAN is confused now,can you help him?

输入

Every data have two lines,the first line include two nums,N and M.

N is the numbers of restaurant,and M is the sum of two dinner.

The second line include N(N<=200) nums,every num indicate the price of a dinner.0<=ai<=1000

输出

If UNCLE RAN can make sion happy,again,print YES,otherwise print NO,because sion is too aojiao,you cant make him to have two dinner in the same restaurant!

提示

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
using namespace std;
const int maxn = 210;
int a[maxn];
int main(){
	int n,m,i,j;
	while(~scanf("%d%d",&n,&m)){
		for(i=1;i<=n;i++){
			scanf("%d",&a[i]);
		}
		bool flag = false;
		for(i=1;i<=n;i++){
			for(j=1;j<=n;j++){
				if(j!=i){
					if(a[i]+a[j]==m){
						flag = true;
					}
				}
			}
		}
		if(flag){
			printf("YES\n");
		}else{
			printf("NO\n");
		}
	}
	
	return 0;
}


问题 B: 辣椒酱在哪里

时间限制: 1 Sec   内存限制: 128 MB
提交: 344   解决: 72
[ 提交][ 状态][ 讨论版]

题目描述

 东东有一套可爱的玩具人偶它们各有不同的职业。 
    有一天这些玩具人偶东东最喜欢的辣椒酱藏了起来。作为一个没有辣椒就吃不下饭的美男子,东东焦急地想要找到他的辣椒酱,东东发现玩具人偶们围成了一个圈,它们有的面朝圈内,有的面朝圈外。

 这时singer告诉东东条线索: “辣椒酱藏在我左数第3个玩具人偶的右数第1个玩具人偶的左数第2个玩具玩具人偶那里。 ” 
    东东发现要破解这条线索找回辣椒酱,玩具人偶的朝向非常关键因为朝内和朝外的玩具人偶的左右方向是相反的面朝圈内的玩具人偶它的左边是顺时针方向右边是逆时针方向而面向圈外的玩具小人它的左边是逆时针方向右边是顺时针方向。 
    东东一边艰难地辨认着玩具小人一边数着
    singer朝内左数第3个是archer。 
    archer朝外,右数第1个是thinker。 
    thinker朝外左数第2个是writer。 
    所以辣椒酱藏在writer这里
    虽然成功找回了眼镜东东并没有放心。如果下次有更多的玩具人偶藏他的辣椒酱或是人偶给的线索更加复杂他可能就无法顺利找到辣椒酱了。 所以东东希望你写程序帮他解决类似的问题 这样的问题具体可以描述为
 n个玩具人偶围成一圈已知它们的职业和朝向。现在第1个玩具人偶告诉东东一个包含 m条指令的线索其中第 z条指令形如左数/右数第 s,个玩具人偶。 你需要输出依次数完这些指令后,到达的玩具人偶的职业。 

输入

    输入的第一行包含西个正整数 n,m, 表示玩具人偶的个数和指令的条数。 
    接下来 n每行包含一个整数和一个字符串以逆时针为顺序给出每个玩具人偶的朝向和职业。其中0表示朝向圈内, 1表示朝向圈外。保证不会出现其他的数。字符串长度不超过10且仅由小写字母构成字符串不为空并且字符串两两不同。 整数和字符串之问用一个空格隔开。 
    接下来 m,其中第 z行包含两个整数 a,,s,,表示第 z条指令。若 a,= 0,表示向左数 s,个人;a,= 1 ,表示向右数 s,个人。保证a,不会出现其他的数, 1≤ s,<=n 。 

输出

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

提示

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
using namespace std;
const int maxn=100000+10;
int state[maxn];
int n,m;
//string str[maxn];
char str[maxn][15];
int find(int pos,int num,int dis)
{
	int s=state[pos];
	int next;
	if((s==0&&dis==0)||(s==1&&dis==1)) 	next=(pos-num+n)%n;
	else next=(pos+num)%n;
	return next;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=0;i<n;i++)
	{
		scanf("%d %s",&state[i],str[i]);
	}
	int pos=0;
	for(int i=1;i<=m;i++)
	{
		int dis,num;
		scanf("%d%d",&dis,&num);
		pos=find(pos,num,dis);
	}
	printf("%s\n",str[pos]);
	return 0;
}


问题 C: Pencil

时间限制: 1 Sec   内存限制: 128 MB
提交: 242   解决: 150
[ 提交][ 状态][ 讨论版]

题目描述

Teacher Dongdong needs to buy N pencils as the present for students who attend the NUAA-HHU programming contest. 

There are 3 kinds of pencil packages in the store. Different packages have different number of pencils and different price. For fairness,  Teacher Dongdong decides to buy only one kind of package of pencils. 

Unpacking the package is forbidden in the store, so perhaps Teacher Dongdong needs to buy more than N pencils to distribute among the students.

Now Teacher Dongdong wants to know the minimum cost of buying at least N pencils, where all kinds of packages in the store are sufficient. 

输入

The first line is a positive integer N, indicating the number of pencils need to be bought.

The following three lines is consisted of two integer in each line: the first integer is the number of pencils in the package, the second integer is the price of the package

It is guaranteed that all numbers above are positive integers less than 10000 

输出

Write one line with one integer, which indicates  the minimum cost.

提示

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
using namespace std;
const double eps = 1e-8;
double save[4];


int main(){
	double n;
	int i,j;
	while(~scanf("%lf",&n)){
		double a,b;

		for(i=1;i<=3;i++){
			scanf("%lf%lf",&a,&b);
			save[i]=ceil(n/a-eps)*b;
		}
		sort(save+1,save+4);
		int ans=save[1];
		printf("%d\n",ans);
		
		
	}
	return 0;
}

问题 D: 回文日期

时间限制: 1 Sec   内存限制: 128 MB
提交: 269   解决: 57
[ 提交][ 状态][ 讨论版]

题目描述

 在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。

    东东习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月 份,最后2位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表 示方法不会相同。

    东东认为,一个日期是回文的,当且仅当表示这个日期的8位数字是回文的。现 在,牛牛想知道:在他指定的两个日期之间包含这两个日期本身),有多少个真实存在的日期是回文的。

    一个8位数字是回文的,当且仅当对于所有的i ( 1 <=i<= 8 )从左向右数的第i个 数字和第9-i个数字(即从右向左数的第i个数字)是相同的。例如:

•对于2016年11月19日,用8位数字20161119表示,它不是回文的。

•对于2010年1月2日,用8位数字20100102表示,它是回文的。

•对于2010年10月2日,用8位数字20101002表示,它不是回文的。

    每一年中都有12个月份:

    其中,1、3、5、7、8、10、12月每个月有31天;4、6、9、11月每个月有30天;而对于2月,闰年时有29天,平年时有28天。

    一个年份是闰年当且仅当它满足下列两种情况其中的一种:

    1.这个年份是4的整数倍,但不是100的整数倍;

    2.这个年份是400的整数倍。

    例如:

    •以下几个年份都是闰年:2000、2012、2016。

    •以下几个年份是平年:1900、2011、2014。

输入

 输入包括两行,每行包括一个8位数字。

    第一行表示牛牛指定的起始日期。

    第二行表示牛牛指定的终止日期。

    保证date_i和都是真实存在的日期,且年份部分一定为4位数字,且首位数字不为0。

    保证date1 —定不晚于date2。

输出

    输出一行,包含一个整数,表示在date1和date2之间,有多少个日期是回文的。

提示

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
using namespace std;
int month[13] = {0,31,28,31,30,31,30,31,31,30,31,30,31};
bool runnian(int n){
	if((n%4==0&&n%100!=0)||n%400==0){
		return true;
	}else{
		return false;
	}
}
bool judge(int n){
	int now = n%100;
	if(now==0){
		return false;
	}
	if(now%10==0){
		return true;
	}
	if(now==1||now==11||now==21){
		return true;
	}
	return false;
}
bool date(int n){
	int now = 0;
	bool res = false;
	now += (n/1000);
	now += ((n%1000)/100*10);
	int yue = 0;
	yue += ((n%100)/10);
	yue += ((n%10)*10);
	//cout<<yue<<" "<<now<<endl;
	bool flag = false;
	if(runnian(n)){
		month[2] = 29;
		flag = true;
	}
	if(now<=month[yue]){
		res = true;
	}
	if(flag){
		month[2] = 28;
	}
	return res;
}
int main(){
	//date(1512);
	char start[15],end[15];
	scanf("%s",start);
	scanf("%s",end);
	int i,j;
	int s = 0,e = 0;
	for(i=0;i<4;i++){
		s +=((start[i] -'0')*pow(10,3-i));
	}
	//cout<<s<<endl;
	for(i=0;i<4;i++){
		e += ((end[i] - '0')*pow(10,3-i));
	}
	//cout<<e<<endl;
	date(s);
	int ans = 0;
	for(i=s+1;i<=e-1;i++){
		if(judge(i)&&date(i)){
			ans++;
		}
	}
	//cout<<"zhognjian "<<ans<<endl;
	
	
	bool killme = false;
	int syue=(start[4]-'0')*10;
	syue+=(start[5]-'0');
	
	int sdate=(start[6]-'0')*10;
	sdate+=(start[7]-'0');
	if(judge(s)&&date(s)){
		int now_yue = 0;
		now_yue += ((s%100)/10);
		now_yue += ((s%10)*10);
		
		int now_date=0;
		now_date+= (s/1000);
		now_date+= ((s%1000)/100*10);
		
		if(syue<now_yue){
			ans++;
			killme = true;
		}
		else if (syue==now_yue){
			if(sdate<=now_date){
				ans++;
				killme = true;
			}
		}
	}
	//cout<<"tou "<<ans<<endl;
	
	int eyue=(end[4]-'0')*10;
	eyue+=(end[5]-'0');
	int edate=(end[6]-'0')*10;
	edate+=(end[7]-'0');
	
	if(judge(e)&&date(e)){
		int now_yue = 0;
		now_yue += ((e%100)/10);
		now_yue += ((e%10)*10);
		
		int now_date=0;
		now_date+= (e/1000);
		now_date+= ((e%1000)/100*10);
		if(eyue>now_yue&&killme){
			ans++;
		}
		else if (eyue==now_yue){
			if(edate>=now_date&&killme){
				ans++;
			}
		}
	}
	//cout<<"wei "<<ans<<endl;
	if(s==e&&killme){
		ans--;
	}

	printf("%d\n",ans);
	return 0;
}

问题 E: 海港

时间限制: 1 Sec   内存限制: 128 MB
提交: 103   解决: 0
[ 提交][ 状态][ 讨论版]

题目描述

K是一个海港的海关工作人员,每天都有许多船只到达海港,船上通常有很多来自不同国家的乘客。

K对这些到达海港的船只非常感兴趣,他按照时间记录下了到达海港的每一艘船只情况;对于第i艘到达的船,他记录了这艘船到达的时间ti (单位:秒),船上的乘 客数星ki,以及每名乘客的国籍 x(i,1), x(i,2),…,x(i,k);。

K统计了n艘船的信息,希望你帮忙计算出以每一艘船到达时间为止的24小时(24小时=86400秒)内所有乘船到达的乘客来自多少个不同的国家。

形式化地讲,你需要计算n条信息。对于输出的第i条信息,你需要统计满足 ti - 86400 < tp <= ti的船只p,在所有的x(p,j)中,总共有多少个不同的数。

输入

第一行输入一个正整数n,表示小K统计了 n艘船的信息。

接下来n行,每行描述一艘船的信息:前两个整数ti和ki分别表示这艘船到达海港的时间和船上的乘客数量,接下来ki个整数x(i,j)表示船上乘客的国7。

保证输入的ti是递增的,单位是秒;表示从小K第一次上班开始计时,这艘船在第 ti 秒到达海港。

数据范围见纸质题目。

输出

输出n行,第i行输出一个整数表示第i艘船到达后的统计信息。

提示

待补完(听说数据有错)

问题 F: 魔法阵

时间限制: 1 Sec   内存限制: 128 MB
提交: 56   解决: 10
[ 提交][ 状态][ 讨论版]

题目描述

六十年一次的魔法战争就要开始了,大魔法师准备从附近的魔法场中汲取魔法能量。

大魔法师有m个魔法物品,编号分别为1,2,...,m。每个物品具有一个魔法值,我们用Xi表示编号为i的物品的魔法值。每个魔法值Xi是不超过n的正整数,可能有多个物品的魔法值相同。

大魔法师认为,当且仅当四个编号为a,b,c,d的魔法物品满足xa<xb<xc<xd,Xb-Xa=2(Xd-Xc),并且xb-xa<(xc-xb)/3时,这四个魔法物品形成了一个魔法阵,他称这四个魔法物品分别为这个魔法阵的A物品,B物品,C物品,D物品。

现在,大魔法师想要知道,对于每个魔法物品,作为某个魔法阵的A物品出现的次数,作为B物品的次数,作为C物品的次数,和作为D物品的次数。

输入

输入文件的第一行包含两个空格隔开的正整数n和m。

接下来m行,每行一个正整数,第i+1行的正整数表示Xi,即编号为i的物品的魔法值。

保证1 <=n<=15000,1<=m<=40000,1<=xi<=n。每个Xi是分别在合法范围内等概率随机生成的。

输出

共输出m行,每行四个整数。第i行的四个整数依次表示编号为i的物品作 为A,B,C,D物品分别出现的次数。

保证标准输出中的每个数都不会超过10^9。

每行相邻的两个数之间用恰好一个空格隔开。

提示

待补完

问题 G: 组合数问题

时间限制: 1 Sec   内存限制: 128 MB
提交: 166   解决: 17
[ 提交][ 状态][ 讨论版]

题目描述

 组合数表示的是从n个物品中选出m个物品的方案数。举个例子,从(1,2,3) 三个物品中选择两个物品可以有(1,2),(1,3),(2,3)这三种选择方法。根据组合数的定 义,我们可以给出计算组合数的一般公式: 

Cnm=n!/(m!(n-m)!)    

其中n! = 1×2×···×n

 
小葱想知道如果给定n,mk,对于所有的0<=i<= n0<=j<= min(i,m)有多少对 (i,j)满足是k的倍数。 

输入

第一行有两个整数t,k,其t代表该测试总共有多少组测试数据,k的意义见【问题描述】。 
    接下来t行每行两个整数n,m,其中n,m的意义见【问题描述】。 

输出

 t行,每行一个整数代表答案。 

提示

待补完

问题 H: Hansir的双11

时间限制: 1 Sec   内存限制: 128 MB
提交: 490   解决: 50
[ 提交][ 状态][ 讨论版]

题目描述

一年一度的双11剁手节刚刚过去,作为南航acm队最有钱的男人——hansir拿出自己每天零花钱中的1/2^64为淘宝销售额做了一些微小的贡献。

作为一个有钱人,hansir买东西与其他人有所区别,无论他买什么东西必须要买两份,用一份扔一份,如果他发现某样东西他只买了一份,侮辱了他有钱人的气质他就会很生气,继而用钱砸死他可怜的队友sion

sion安插在hansir身边的内奸苍兄透露,hansir这次由于操作失误有两件东西只购买了一份,为了自己钱包的幸福,sion想要知道hansir哪两件东西只购买了一份,由于时间紧迫,sion只有极其非常相当短的时间去确认,你可以写一个程序帮助可怜的sion吗?

输入

每组数据第一行包括一个数n,表示hansir11买的东西的件数。接下来一行包含n个数,a1a2,……,an表示hansir在双11购入了一件编号为ai的商品。

数据保证n个数中只有两个商品编号只出现过一次,其余都出现过两次,ai是不大于int最大值的正整数。

输出

每组数据输出一行,包括两个数,分别为hansir由于失误只购买了一件的商品的编号。先输出编号小的再输出编号大的,两个数之间相隔一个空格,行末无空格。

提示

数据智障啊

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
using namespace std;
const int maxn = 1e5+10;
long long  save[maxn];
//map<int,int> judge;
long long res[10];
int main(){
	int n,i,j;
	scanf("%d",&n);
		for(i=1;i<=n;i++){
			scanf("%lld",&save[i]);
		}
		sort(save+1,save+1+n);
		j=-1;
		
		for(i=1;i<n;i++){
			if(save[i]==save[i+1]){
				i++;
			}else{
				res[++j] = save[i];
			}
			if(j==1){
				break;	
			}
		}
		if(save[n]!=save[n-1]){
			res[++j] = save[n];
		}
		printf("%lld %lld\n",res[0],res[1]);
	
	
	return 0;
}

问题 I: Stupid sion Ⅰ

时间限制: 1 Sec   内存限制: 128 MB
提交: 136   解决: 29
[ 提交][ 状态][ 讨论版]

题目描述

After a 5-hour algorithm contest,everyone will be Stupid.

In order to avoid the jeer from Uncle Ran,sion and hansir play a game to recover their IQ.

Now hansir give sion a 2D board containing O and X,sion need to capture all regions surrounded by 'X'.A region is captured by flipping all 'O's into 'X's in that surrounded region.

For example,hansir give sion a board

XXXXX

XOOOX

XOXXX    

XXOXX

Sion should change it to

XXXXX

XXXXX

XXXXX

XXOXX

 

But sion is stupid now,can you help him?

输入

First input two numbers,n,m indicates the size of board.

Then N lines indicates the details of board.

输出

The board after change.

提示

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <vector>
using namespace std;
int n,m;
const int maxn = 1010;
int vis[maxn][maxn];
string save[maxn];
int dx[4] = {0,0,1,-1};
int dy[4] = {1,-1,0,0};
void dfs(int x,int y){
	int nx,ny;
	vis[x][y] = -1;
	int i;
	for(i=0;i<4;i++){
		int nx = x+dx[i];
		int ny = y+dy[i];
		if(nx>=0&&nx<n&&ny>=0&&ny<m&&save[nx][ny]=='O'&&vis[nx][ny]==0){
			dfs(nx,ny);
		}
	}
	return;
}
int main(){
	int i,j;
	
	scanf("%d%d",&n,&m);
	for(i=0;i<n;i++){
		cin>>save[i];
	}
	memset(vis,0,sizeof(vis));
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			if(save[i][j]=='X'){
				vis[i][j] = 1;
			}			
		}
	}
	for(i=0;i<n;i++){
		if(save[i][0]=='O'){
			dfs(i,0);
		}
		if(save[i][m-1]=='O'){
			dfs(i,m-1);
		}
	}
	for(i=0;i<m;i++){
		if(save[0][i]=='O'){
			dfs(0,i);
		}
		if(save[n-1][i]=='O'){
			dfs(n-1,i);
		}
	}
	for(i=0;i<n;i++){
		for(j=0;j<m;j++){
			if(vis[i][j]==0){
				printf("X");
			}else if(vis[i][j]==-1){
				printf("O");
			}else{
				printf("X");
			}
		}
		printf("\n");
	}
	return 0;	
}

问题 J: Stupid sion Ⅱ

时间限制: 1 Sec   内存限制: 128 MB
提交: 86   解决: 10
[ 提交][ 状态][ 讨论版]

题目描述

After a 5-hour algorithm contest,everyone will be Stupid.

In order to avoid the jeer from Uncle Ran,sion and hansir play a game to recover their IQ.

Now hansir give sion a 2D board containing X and Q,sion need to find a square that every gird in the square is X in the 2D board.To help sion recover his IQ,you should help him to find the bigest square in the 2D board.

输入

First input two numbers,n,m indicates the size of board.

Then N lines indicates the details of board.

输出

The bigest sqares side length.

提示

待补完

问题 K: Hansir’s dinner

时间限制: 1 Sec   内存限制: 512 MB
提交: 167   解决: 0
[ 提交][ 状态][ 讨论版]

题目描述

As we all know,hansir is the richest man in the NUAA ACM TEAM,his dinner is different with sion and Uncle Ran.

When hansir wants to have a dinner,he make N kinds of food and select 3 to eat.As a rich man,hansir is picky,if the ith foods value is ai,he wants the three foods satisfied the sum of their value equal M.

Please write a program to help hansir to choose all group to have a dinner,hansir wants to eat delicious food at first,so print all of answer in a descending order,and for every answer print the most delicious first,the second delicious second,and the worst food.

输入

Each data has two lines,the first line has one number n indicates there are n kinds of food to select.the second line has n numbers indicates the ith kind of foods value.

输出

You should print all of answervaule in a descending order,if the first kind of foods value if same,compare the second and then.THE MOST IMPORTANT is the answer cant be repeated.

Because sion is so kind,hansir have a way to have a dinner at least in sions data.

提示

待补完

问题 L: 换教室

时间限制: 1 Sec   内存限制: 128 MB
提交: 10   解决: 3
[ 提交][ 状态][ 讨论版]

题目描述

  对于刚上大学的东东来说, 他面临的第一个问题是如何根据实际情况选择合适的课程。 
    在可以选择的课程中,有2n节课程安排在n个时间段上。在第 i ( 1≤ i≤n)个时同段上, 两节内容相同的课程同时在不同的地点进行, 其中, 东东预先被安排在教室 ci上课, 而另一节课程在教室 di进行。 
    在不提交任何申请的情况下,学生们需要按时间段的顺序依次完成所有的n节安排好的课程。如果学生想更换第i节课程的教室,则需要提出中情。若申请通过,学生就可以在第 i个时间段去教室 di上课, 否则仍然在教室 ci上课。 
    由于更换教室的需求太多, 申请不一定能获得通过。 通过计算, 东东发现申请更换第 i节课程的教室时, 中情被通过的概率是一个已知的实数 ki, 并且对于不同课程的申请, 被通过的概率是互相独立的。 
    学校规定, 所有的申请只能在学期开始前一次性提交, 并且每个人只能选择至多m节课程进行申请。 这意味着东东必须一次性决定是否申请更换每节课的教室, 而不能根据某些课程的申请结果来决定其他课程是否申请; 东东可以申请白己最希望更换教室的 m门课程,也可以不用完这m个中情的机会,甚至可以一门课程都不申请。 
因为不同的课程可能会被安排在不同的教室进行, 所以东东需要利用课问时间从一间教室赶到另一间教室。 
    东东所在的大学有 v个教室,有 e条道路。每条道路连接两间教室, 并且是可以双向通行的。 由于道路的长度和拥;i者程度不同, 通过不同的道路耗费的体力可能会有所不同。当第i ( 1≤i≤n-1 )节课结束后,东东就会从这节课的教室出发,选择一条耗费体力最少的路径前往下一节课的教室。 
    现在东东想知道,申请哪几门课程可以使他因在教室问移动耗费的体力值的总和的期望值最小,请你帮他求出这个最小值。 

输入

  第一行四个整数 n,m,v,e 。 n表示这个学期内的时间段的数量; m表示东东最多可以申请更换多少节课程的教室; v表示东东学校里教室的数量; e表示东东的学校里道路的数量。 
    第二行n个正整数,第 i ( 1≤ i≤ n)个正整数表示c,,即第 i个时间段东东被安排上课的教室;保证1≤ ci≤ v。 
    第三行n个正整数,第 i ( 1≤ i≤ n)个正整数表示di,即第 i个时间段另一间上同样课程的教室;保证1≤ di≤ v。 
    第四行n个实数,第 i ( 1≤ i≤ n)个实数表示ki,即东东申请在第 i个时间段更换教室获得通过的概率。保证0≤ ki≤1 。 
    接下来 e行,每行三个正整数aj,bj,wj,表示有一条双向道路连接教室 aj ,bj ,通过这条道路需要耗费的体力值是 Wj ;保证1≤ aj,bj≤ v, 1≤ wj≤100 。 
    保证1≤n≤2000, 0≤m≤2000, 1≤v≤300, 0≤ e≤90000。 
    保证通过学校里的道路,从任何一间教室出发,都能到达其他所有的教室。 
    保证输入的实数最多包含3位小数。 

输出

    输出一行,包含一个实数,四舎五入精确到小数点后恰好2位,表示答案。你的 
    输出必须和标准输出完全一样才算正确。 
    测试数据保证四舎五入后的答案和准确答案的差的绝对值不大于4 *10^-3 。 (如果你不知道什么是浮点误差, 这段话可以理解为: 对于大多数的算法, 你可以正常地使用浮点数类型而不用对它进行特殊的处理)

提示

待补完

问题 M: 蚯蚓

时间限制: 1 Sec   内存限制: 128 MB
提交: 45   解决: 6
[ 提交][ 状态][ 讨论版]

题目描述

本题中,我们将用符号 LcJ 表示对 c 向下取整,例如: L3.0J = L3.1J = L3.9J = 3 。 蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去 请神刀手来帮他们消灭蚯蚓。 
蛐蛐国里现在共有 n 只蚯蚓( n 为正整数)。 每只蚯蚓拥有长度,我们设第 i 只匠 蚓的长度为 ai ( i = 1, 2, … , n ),并保证所有的长度都是非负整数(即:可能存在长度为 0 的蚯蚓)。 
每一秒,神刀手会在所有的蚯蚓中,准确地找到最长的那一只(如有多个则任选 一个)将其切成两半。 神刀手切开蚯蚓的位置由常数 p (是满足 0 < p < 1 的有理数) 决定,设这只蚯蚓长度为 x ,神刀手会将其切成两只长度分别为 LpxJ 和 x − LpxJ 的匠 蚓。特殊地,如果这两个数的其中一个等于 0 ,则这个长度为 0 的蚯蚓也会被保留。此 外,除了刚刚产生的两只新蚯蚓,其余蚯蚓的长度都会增加q(是一个非负整常数)。 
蛐蛐国王知道这样不是长久之计,因为蚯蚓不仅会越来越多,还会越来越长。蛐蛐国王决定求助于一位有着洪荒之力的神秘人物,但是救兵还需要 m 秒才能到来… … ( m 为非负整数) 
蛐蛐国王希望知道这 m 秒内的战况。 具体来说,他希望知道: • m 秒内,每一秒被切断的蚯蚓被切断前的长度(有 m 个数): • m 秒后,所有蚯蚓的长度(有 n + m 个数)。 蛐蛐国王当然知道怎么做啦! 但是他想考考你… …

输入

第一行包含六个整数n,m,q,u,v,t,其中:n,m,q的意义见【问题描述】;u,v,t均为正整数;你需要自己计算 p=u/v(0<u<v)  t是输出参数,其含义将会在【输出格式】中解释。

第二行包含n个非负整数,为ai,a2,…,an,即初始时n只蚯蚓的长度。

同一行中相邻的两个数之间,恰好用一个空格隔开。

1<=n<=1050<m<71060<u<v<1090<=q<=2001<t<710<ai<108

输出

第一行输出[m/t]个整数,按时间顺序,依次输出第t秒,第2t秒,第3t秒……被切断蚯蚓(在被切断前)的长度。

第二行输出[(n+m)/t]个整数,输出m秒后蚯蚓的长度;需要按从大到小的顺序,依次输出排名第t,第2t,第3t……的长度。

同一行中相邻的两个数之间,恰好用一个空格隔开。即使某一行没有任何数需要 输出,你也应输出一个空行。

请阅读样例来更好地理解这个格式。

提示

待补完










评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值