算法设计与编程挑战赛(秋季赛)

走出浪浪山

内存限制:512Mb

时间限制:1s

提交:8414

解决:2678

题目描述

走出浪浪山,发现到处都是浪浪山。

Alice 是一个可爱的小猪妖,最讨厌造箭,但妖怪大王命令小猪妖一天内审核这一堆箭中有几根不符合要求。

Alice 需要将这一堆箭顺序排开,挑出其中不符合要求的箭,其中我们用数字11表示这是一根符合要求的箭,用00表示这是一根不符合要求的箭。

对于这一堆打包好的箭,我们用一个不超过 unsigned int表示范围的数字表示,其中 『将这一堆箭顺序排开』 可以理解为将其十进制数值转化为二进制。

注意,其中箭的个数指的是其二进制下最高位11开始计数的长度,不包含额外补的00

请你帮帮Alice,早日走出浪浪山。

输入

一行,一个整数 nn,表示一堆箭。

输出

输出一行整数,表示答案。

样例输入1

复制

7

样例输出1

复制

0

样例输入2

复制

8

样例输出2

复制

3

提示

数据范围

对于 100 \%100% 的数据,1 \leqslant n \leqslant 2^{32}-11n232−1

样例解释

77,在表示为二进制后,数值是111111,共3根箭,故没有不合格的箭。

88,在表示为二进制后,数值为10001000,共4根箭,故不合格的箭个数为33

代码:

#include<cstdio>

#include<iostream>

#include<cstring>

using namespace std;

const long long N = 1e8;

long long n;

int main(){

  cin >> n;

  long long count = 0;

  if(n % 2 == 0){

    count += 1;

  }

  while(n != 1){

    long long temp = n;

    if((temp / 2) % 2 != 0){

          n /= 2;

          continue;

        }

      else{

            n /= 2;

            count ++;

      }

  }

  cout << count << endl;

}

#include<cstdio>
#include<iostream>
#include<cstring>

using namespace std;

const long long N = 1e8;

long long n;

int main(){
  cin >> n;
  long long count = 0;
  if(n % 2 == 0){
  	count += 1;
  }
  while(n != 1){
  	long long temp = n;
  	if((temp / 2) % 2 != 0){
  		n /= 2;
  		continue;
	  }
	else{
		n /= 2;
		count ++;
	}
  }
  cout << count << endl;
}

交流是一件很酷的事情

内存限制:512Mb

时间限制:1s

提交:6836

解决:621

题目描述

古老的王国中有 nn 个城市,这些城市之间由 mm 条道路相连接。现在又到了一年一度要举行交流会的时候,国王计划要在这些城市之间举行 kk 场交流会,每一场交流会在指定的两个城市间举行。

每个城市都有独一无二的思想,思想只有通过交流才能够流通,交流是一个相互并且可以传到的过程,比如说,如果城市 aa 和城市 bb 进行了交流,那么城市 aa 和城市 bb 就都拥有了对方的思想;如果城市 bb 和城市 cc 又有交流,那么城市 aabbcc 就都有三份思想。

然而,你作为王国的军师,充分明白复习的重要性,在收到了国王的计划之后,你深知如果城市 aa 有了城市 bb 的思想,但是两个城市之间不能相互到达,即没有道路直接或者间接连接,那么他们就无法在交流会之后再次交流,在一段时间后他们就会忘记对方的思想。

国王想要知道在这些交流会很久之后,所有的城市中,最多能够有多少份思想、最少又能够有多少份思想。注意,每一个城市最初就有一个自己的想法。

输入

第一行两个整数 nnmm,表示城市的数量和道路的数量。

接下来 mm 行,每行两个整数 u_{i}uiv_{i}vi,表示城市 u_{i}ui  v_{i}vi 之间有一条道路相连接。

接下来一行一个整数 kk,表示交流会的数量。

接下来 kk 行,每行两个整数 x_{i}xiy_{i}yi,表示预计在城市 x_{i}xi 和城市 y_{i}yi 之间举行一场交流会。

输出

输出一行两个整数 maxvmaxv  minvminv,表示城市最多的思想数量和最少的思想数量。

样例输入1

复制

8 6

1 3

1 4

2 7

3 5

3 6

3 8

5

1 3

1 8

2 3

2 7

4 6

样例输出1

复制

3 1

提示

数据规模与约束

对于 100 \%100% 的数据,2 \leqslant n, m, k \leqslant 2 \times 10^{5},1\leqslant u_i,v_i,x_i,y_i \leqslant n2n,m,k2×105,1ui,vi,xi,yin,保证无重边无自环。

样例解释

所有交流会结束后,每座城市有的思想如下:

  • 城市 1:1、2、3、7、8
  • 城市 2:1、2、3、7、8
  • 城市 3:1、2、3、7、8
  • 城市 4:4、6
  • 城市 5:5
  • 城市 6:4、6
  • 城市 7:1、2、3、7、8
  • 城市 8:1、2、3、7、8

而在原图中,[1,3,8][1,3,8] 联通,[2,7][2,7] 联通,[4,6][4,6] 联通。

所以在足够长的时间过后,各个城市拥有的思想会维持在以下状态:

  • 城市 1:1、3、8
  • 城市 2:2、7
  • 城市 3:1、3、8
  • 城市 4:4、6
  • 城市 5:5
  • 城市 6:4、6
  • 城市 7:2、7
  • 城市 8:1、3、8

故城市最多有 3 份思想(城市 1、城市 3、城市 8),最少只有 1 份思想(城市 5)。

观察火车

内存限制:512Mb

时间限制:1s

提交:11882

解决:1834

题目描述

小凯喜欢在铁路边观察火车。

众所周知,绝大多数铁路都使用双轨铁路,经过小凯的建模,他发现在模型中,如果两个轨道之间的间距满足 dis=a^2-b^2dis=a2b2 ,其中a>ba>b,且是自然数,那么这个铁路就很

现在小凯想知道,在轨道距离不超过 nn 的情况下,共有多少种很酷的间距。

因为火车轨道很宽,所以间距只能取从 11 开始的整数

输入

输入一个整数 nn 表示轨道间距最宽为 nn 米。

输出

输出一行一个整数表示答案。

样例输入1

复制

10

样例输出1

复制

7

提示

数据范围

对于 100 \%100% 的数据,1 \leqslant n \leqslant 10^{7}1n107

样例解释

间距可取的值是 1122334455667788991010 ,其中很的间距数值是 11334455778899 ,所以答案为 77 

其中

  • 1=1^2-0^21=12−02
  • 3=2^2-1^23=22−12
  • 4=2^2-0^24=22−02
  • 5=3^2-2^25=32−22
  • 7=4^2-3^27=42−32
  • 8=3^2-1^28=32−12
  • 9=5^2-4^29=52−42

代码:

#include<cstdio>
#include<iostream>
#include<cstring>
#include<math.h>

using namespace std;

const long long N = 10000010;

long long n;

long long arr[N];

int main(){
  cin >> n;
  long long count = 0;
  
  long long jishu = 0;
  
  for(long long i = 1; i <= n; i++){
//  	if(2*i-1 > n){
//  		break;
//	}
//	else{
//		arr[2*i-1] = 1;
//		count++;
//	}
  	for(long long j = i-1; i*i - j*j <= n && j>=0; j--){
  		long long dis = i*i - j*j;
  		if(dis <= n){
  			jishu++;
//  			cout <<i << " " << j <<" " << dis<< "计数:"<<jishu<<endl ;
//			if(arr[dis] != 1){
				arr[dis] = 1;
//				count ++;
//			}
		  }
	  }
  }
  for(long long i = 0; i <= n; i++){
  	if(arr[i] == 1){
  		count ++;
	  }
  }
  cout << count << endl;
}

可以自由规划真是太酷啦

内存限制:512Mb

时间限制:1s

提交:807

解决:43

题目描述

一座现代化的城市由密密麻麻的道路网格构成,从上往下俯瞰就像是一张庞大的纸上交错着若干条线条,我们这里只考虑最简单的规划情况,只考虑垂直道路和水平道路。

每一条水平道路代表一条平行于 xx 轴的道路,每一条垂直道路代表一条平行于 yy 轴的道路,根据汤汁村的地理条件,我们一共有 nn 条平行于 yy 轴的道路备选,有 mm 条平行于 xx 轴的道路备选。

一个城市规划优秀与否可以用重面积来评估。

在道路规划好后,我们要开始建设建筑,我们同样只考虑最简单的建筑,即矩形的建筑。一个建筑可以横跨多个道路,但是建筑的四周必须紧贴道路。

重面积就是所有可能的建筑物的面积总和。

用更加人话的话来说就是,每两条平行于 yy 轴的道路和两条平行于 xx 轴的道路可以确定一个矩形,重面积就是所有这些矩形的面积之和。

现在根据上级的要求和经费的限制,你需要恰好建设其中的任意 kk 条道路,请问如何选择可以使得城市的重面积最大?这个结果可能很大,请你对 10^{9} + 7109+7 取模输出。

输入

第一行三个整数 nnmmkk,

分别表示平行于 yy 轴的备选道路数、平行于 xx 轴的备选道路数和需要建设的道路数量。

接下来一行 nn 个整数 x_{1}, x_{2}, \dots, x_{n}x1,x2,…,xn,表示平行于 yy 轴的备选道路的 xx 坐标。

接下来一行 mm 个整数 y_{1}, y_{2}, \dots, y_{n}y1,y2,…,yn,表示平行于 xx 轴的备选道路的 yy 坐标。

输出

输出一行一个整数,表示最大的重面积取模过后的结果。

样例输入1

复制

5 5 8

1 4 2 6 8

-1 5 9 4 -3

样例输出1

复制

1050

提示

数据范围

对于 100 \%100% 的数据,2 \leqslant n, m \leqslant 10^{5}, 1 \leqslant k \leqslant 10^{4}, -10^{9} \leqslant x_{i}, y_{i} \leqslant 10^{9}2n,m105,1k104,−109xi,yi109

数据不保证中间计算结果在 long long int 范围内,请考虑使用 __int128

样例解释

平行与 yy 轴的道路我们选择 \left\{ 1, 2, 6, 8 \right\}{1,2,6,8},平行于 xx 轴的道路我们选择 \left\{ -1, 5, 9, -3 \right\}{−1,5,9,−3}

则可能存在以下建筑:

  • y: \left\{ 1, 2 \right\}, x: \left\{ -1, 5 \right\} \to 6y:{1,2},x:{−1,5}→6
  • y: \left\{ 1, 2 \right\}, x: \left\{ -1, 9 \right\} \to 10y:{1,2},x:{−1,9}→10
  • y: \left\{ 1, 2 \right\}, x: \left\{ -1, -3 \right\} \to 2y:{1,2},x:{−1,−3}→2
  • \dots…
  • y: \left\{ 2, 6 \right\}, x: \left\{ -1, 5 \right\} \to 24y:{2,6},x:{−1,5}→24
  • \dots…
  • y: \left\{ 6, 8 \right\}, x: \left\{ 9, -3 \right\} \to 24y:{6,8},x:{9,−3}→24

面积之和为 1050

灵机一动给同学做点好菜

内存限制:512Mb

时间限制:1s

提交:277

解决:7

题目描述

你是一名特级厨师,你的身上有一本绝世秘籍,其中记载了 nn 种食材之间的 n - 1n−1 种绝配关系,每一个绝配关系可以描述为食材 aa 和食材 bb 放在一起是真的绝配!,我们称食材 aa 和食材 bb  1 级绝配。

如果食材 aa 和食材 bb 是绝配,食材 bb 和食材 cc  绝配,那么当食材 aabbcc 同时搭配在一起时,也是绝配。我们保证任意两种食材都可以直接或者间接地成为绝配。

即食材之间的绝配关系构成了一棵树,食材之间的绝配等级是食材两点之间的距离。

在同学们的盛情和上级的指令下,现在你需要发明 mm 道新的美味佳肴,可是人哪能创新得那么快,头疼的你决定凭借你的灵机一动,,根据绝世秘籍去批量地胡乱创造这些菜品。

你首先为 mm 道菜每道都准备了 nn 种食材,随后你灵机一动了 qq 次,每一次,你考虑第 ll 道菜到第 rr 道菜,你将每道菜中可以使得食材 uu 和食材 vv 成为绝配的最少的食材打包成一个料理包。

如果他们本来就在一个料理包里了,就不用操作。如果食材 uu 和食材 vv 已经分别在不同的料理包中,我们就将两个料理包打包在一起。

即一个料理包就是把树上两个食材及其之间的最短路上的食材,全部看作一个点。

进行完 qq 次灵机一动后,各式各样的菜已经摆在了你的面前,并且都已经被你打包成了容易加工的料理包,这下可以很方便地给同学们去做了,但是作为特级厨师的你知道,这些菜还不是最好的,都有些遗憾,我们定义一道菜的遗憾值,为这道菜中任意两种食材 aa  bb 之间绝配等级的总和。

用不是那么人话的方式来说,遗憾值就是经过了打包后树上任意两点之间的距离之和。

你想知道每一道菜的遗憾值。


题意可以等价地理解为:

mm 张图,初始每张图都是一个相同的,nn 个结点的树。依次进行 qq 次操作,每次操作如下:

  • 给定 l,r,u,vl,r,u,v
  • 将第 ll 个图到 rr 个图的从 uu 到 vv 的路径缩成一个点(如果已经在一个点中,则忽略该操作)。

定义一张图 G=(E,V)G=(E,V)的权值是

\sum_{\forall u,v \in V} dis_{u,v}u,vVdisu,v

其中,dis_{u,v}disu,v 表示 uu  vv 的距离。在所有操作后,求出每一张图的权值。

输入

第一行两个整数 nnmmqq,表示食材的种数、需要准备的菜的数量和灵机一动的数量。

接下来 n - 1n−1 行,每行两个整数 uuvv,表示食材uu 和食材 vv 之间是绝配。

接下来 qq 行,每行四个整数 l_{i}, r_{i}, u_{i}, v_{i}li,ri,ui,vi,表示一个灵机一动。

输出

输出 mm 行,每行一个整数 x_{i}xi 表示第 ii 道菜的遗憾值。

样例输入1

复制

7 10 5

1 2

2 3

3 4

3 5

2 6

5 7

2 6 4 5

2 10 5 6

6 10 6 1

1 2 4 2

4 5 5 4

样例输出1

复制

28

12

12

12

12

6

12

12

12

12

提示

数据范围

对于 100 \%100% 的数据,1 \leqslant n, m, q \leqslant 5 \times 10^{4}1n,m,q5×104

样例解释

我们有 7 种食材,10 道菜和 5 个灵机一动。

在进行完 5 个灵机一动后,每道菜的情况:

  • 1 号:食材 2、3、4 在一个调料包里
  • 2 号:食材 2、3、4、5 、6在一个调料包里
  • 3 号:食材 2、3、4、5 、6在一个调料包里
  • 4 号:食材 2、3、4、5 、6在一个调料包里
  • 5 号:食材 2、3、4、5 、6在一个调料包里
  • 6 号:食材 2、3、4、5 、6在一个调料包里
  • 7 号:食材 1、2、3、5 、6在一个调料包里
  • 8 号:食材 1、2、3、5 、6在一个调料包里
  • 9 号:食材 1、2、3、5 、6在一个调料包里
  • 10 号:食材 1、2、3、5 、6在一个调料包里

九宫格

内存限制:512Mb

时间限制:1s

提交:6026

解决:2361

题目描述

小宁想用九宫格给她的朋友小谦发送英文短信,键盘布局如下

例如字母b需要按 22 两下,按空格就是按一下,请问小宁想发送一个句子的话,需要按多少下呢?

输入

一个句子,包含小写英文单词和空格。

输出

一个整数,表示要按键的次数。

样例输入1

复制

i miss you

样例输出1

复制

25

样例输入2

复制

how are you

样例输出2

复制

22

提示

数据范围

对于 100 \%100% 的数据,句子字符不超过200200个,且均以字母为结尾。

样例解释

样例说明1

ii需要按键33次,空格需要按键11次,mm需要按键11次,ss需要按键44次,yy需要按键33次,oo需要按键33次,uu需要按键22次,总按键次数3+1+1+3+4+4+1+3+3+2=253+1+1+3+4+4+1+3+3+2=25

样例说明2

hh需要按键22次,oo需要按键33次,ww需要按键11次,空格需要按键11次,aa需要按键11次,rr需要按键33次,ee需要按键22次,总按键次数2+3+1+1+1+3+2+1+3+3+2=222+3+1+1+1+3+2+1+3+3+2=22

来源/分类

有一些东西必不可少

内存限制:512Mb

时间限制:1s

提交:3784

解决:352

题目描述

你准备要出去旅游了!你整理着你的行囊,有好多好多东西你想带着,数了数一共有 nn 件,每一件物品在你的心中都有一个幸福指数 a_{i}ai,每一次旅行你可以选择其中一部分东西或者全部的东西带上。

你希望一场旅行的幸福指数之和要大于等于 kk,想要满足你的这个条件,有若干种选择物品的方案,如果某一个物品出现在了这些方案中,我们就说这个物品是重要的。

但是不是每一个重要的物品都是必要的,必要的物品是指,在某一个包含这个物品的选择方案中,如果缺少了这个物品,这个方案就不成立了,即不能够使得幸福指数之和大于等于 kk 了。

你想知道这些物品之中有哪一些是必要的。

输入

第一行两个整数 nnkk,表示物品的数量和幸福指数之和的要求。

接下来一行 nn 个整数 a_{1}, a_{2}, \dots, a_{n}a1,a2,…,an,表示每个物品的幸福指数。

输出

输出一行一个整数,表示必要的物品数量。

样例输入1

复制

6 20

10 4 3 10 25 2

样例输出1

复制

3

提示

数据范围

对于 100 \%100% 的数据,1 \leqslant n, k \leqslant 5000,1 \leq a[i] \leq 10^91n,k5000,1≤a[i]≤109

样例解释

对于每一个物品:

  • 第一个物品 10 是必要的,因为在方案 10 10 中不能缺少;
  • 第二个物品 4 不是必要的,因为在任何一个方案中都可以被去掉;
  • 第三个物品 3 不是必要的,因为在任何一个方案中都可以被去掉;
  • 第四个物品 10 是必要的,因为在方案 10 10 中不能缺少;
  • 第五个物品 25 是必要的,因为在方案 25 2 中不能缺少;
  • 第六个物品 2 不是必要的,因为在任何一个方案中都可以被去掉;

所以必要的物品有 3 个。

#include<cstdio>
#include<iostream>
#include<cstring>
#include<math.h>
#include<string.h>

using namespace std;

const int N = 2100;

string input[N]; 

int count = 0;

int main(){
	char c;
	int n = 0;
	do{
		n++;
		cin >> input[n];
	}while(cin.get()== ' ');
	count = n-1;
	for(int i = 1; i <= n; i++){
		for(int j = 0; j <= input[i].length(); j++){
			cout << input[i][j] << endl;
			switch(input[i][j]){
				case ' ': count += 1; break;
				case 'a': count += 1; break;
				case 'b': count += 2; break;
				case 'c': count += 3; break;
				
				case 'd': count += 1; break;
				case 'e': count += 2; break;
				case 'f': count += 3; break;
				
				case 'g': count += 1; break;
				case 'h': count += 2; break;
				case 'i': count += 3; break;
				
				case 'j': count += 1; break;
				case 'k': count += 2; break;
				case 'l': count += 3; break;
				
				case 'm': count += 1; break;
				case 'n': count += 2; break;
				case 'o': count += 3; break;
				
				case 'p': count += 1; break;
				case 'q': count += 2; break;
				case 'r': count += 3; break;
				case 's': count += 4; break;
				
				case 't': count += 1; break;
				case 'u': count += 2; break;
				case 'v': count += 3; break;
				
				case 'w': count += 1; break;
				case 'x': count += 2; break;
				case 'y': count += 3; break;
				case 'z': count += 4; break;
			} 
		}
	}
	cout << count;
}

再靠近一点就会爆炸

内存限制:512Mb

时间限制:1s

提交:609

解决:39

题目描述

Alice Bob 是两位拆蛋专家,他们都绝顶聪明,在解决问题的时候都会选择对自己最优的方案,但是他们现在遇到了一个大麻烦。

现在地上从左到右一共有 nn 个蛋摆成一排,每个蛋在经过检验后都标上了一个专属的数值 v_{i}vi,这些蛋有一个神奇的性质,如果两个数值相同的蛋相邻的话,就会融化然后爆炸。

拆蛋专家 Alice Bob 希望能够解决这个问题,他们轮流进行操作,Alice 先操作,每一次进行操作的人可以选择其中一个蛋丢掉。

但是为了满足安全限制,不发生爆炸事故,必须要满足以下要求:

  • 不能丢掉两端的蛋
  • 丢掉选择的蛋之后,不能存在两个数值相同的蛋相邻

如果到某一个人的回合他不能操作了,他就失败了,因为无论怎么做他都会被爆炸了。

Alice Bob 想要对目前的情况做一个风险评估,他们想知道对于所有 [l, r][l,r] 的区间,有多少种区间 Alice 获胜,有多少种区间 Bob 获胜。

输入

第一行一个整数 nn,表示蛋的数量。

接下来一行 nn 个整数 v_{i}vi,表示每个蛋上的数值。

输出

输出一行两个整数 aabb,分别表示 Alice 获胜的区间数量和 Bob 获胜的区间数量。

样例输入1

复制

6

4 3 9 8 3 1

样例输出1

复制

7 14

提示

数据范围

对于 100 \%100% 的数据,3 \leqslant n \leqslant 10^{5}, 1 \leqslant v_{i} \leqslant 1003n105,1vi100

样例解释

Alice 获胜的区间:[1, 3][1,3][1, 5][1,5][2, 4][2,4][2, 5][2,5][2, 6][2,6][3, 5][3,5][4, 6][4,6],其他区间 Bob 都能获胜。

逛花园

内存限制:512Mb

时间限制:1s

提交:4855

解决:2520

题目描述

小凯很喜欢逛花园,花园里布置有一些美丽的排列,好像写的是一些形如 a_1^{q_1}+a_2^{q_2}+...+a_n^{q_n}a1q1​​+a2q2​​+...+anqn​​ 数学式子展开。

那天刮起了大风,巧妙的将所有数字的幂次都掉了下来,即式子变成了 b_1+b_2+...+b_nb1+b2+...+bn ,其中 b_i = a_i\times 10 + q_ibi=ai×10+qi 

现在小凯想算一下原先数学式子的值,即 \sum_{i=1}^na_i^{q_i}i=1naiqi​​,你可以帮帮他吗?

哦对,花园门口好像歪七扭八写的什么 1\leq q_i \leq 91≤qi≤9 什么的,不知道对你有帮助吗?

输入

第一行,一个正整数 nn

接下来 nn 行,每行一个整数表示 b_ibi

输出

仅一行一个整数,\sum_{i=1}^na_i^{q_i}i=1naiqi​​ 的值。

样例输入1

复制

2

22

33

样例输出1

复制

31

样例输入2

复制

5

11

22

33

44

55

样例输出2

复制

3413

样例输入3

复制

3

124512

867

2525

样例输出3

复制

35809192269129

提示

数据范围

对于 100 \%100% 的数据,1 \le n \le 101≤n≤1010 \le b_i \le 20000010≤bi≤200000,1 \leq \sum_{i=1}^na_i^{q_i} \leq 10 ^ {18}1≤i=1naiqi​​≤1018

样例解释

样例说明1

  • 22=2\times10+222=2×10+2
  • 33=3\times10+333=3×10+3

这样,原式值是2^2+3^3=3122+33=31

样例说明2

  • 11=1\times10+111=1×10+1
  • 22=2\times10+222=2×10+2
  • 33=3\times10+333=3×10+3
  • 44=4\times10+444=4×10+4
  • 55=5\times10+555=5×10+5

这样,原式值是1^1+2^2+3^3+4^4+5^5=341311+22+33+44+55=3413

样例说明3

  • 124512=12451\times10+2124512=12451×10+2
  • 867=86\times10+7867=86×10+7
  • 2525=252\times10+52525=252×10+5

这样,原式值是12451^2+86^7+252^5=35809192269129124512+867+2525=35809192269129

#include<cstdio>
#include<iostream>
#include<cstring>
#include<math.h>

using namespace std;

const int N = 11;

long long a[N];
long long b[N];
long long q[N];
long long sum[N];

int n;

int main(){
  cin >> n;
  for(int i =1 ; i<= n; i++){
    cin >> b[i];
    a[i] = b[i]/10;
    q[i] = b[i]%10;
  }
  
  long long num = 0;
  for(int i = 1; i <= n; i++ ){
  	long long temp = 1;
  	for(int j = 1; j <= q[i]; j++){
  		temp = temp * a[i];
	  }
	sum[i] = temp;
//	cout << sum[i] << endl;
  }
  
  for(int i = 1; i <= n; i++){
  	num += sum[i];
  }
  cout << num << endl;
  
//  long long x = 35809192269129;
//  
//  long y = 124512;
//  long c = y%10;
//  long d = y/10;
  
//  cout << c <<"  "<< d << endl;
  
//  cout << x; 
}



人们总是渴望最强大的力量

内存限制:512Mb

时间限制:1s

提交:5118

解决:206

题目描述

你是一个魔法学院的学徒,在经历了四年的魔法煎熬后,终于到了毕业的日子,学院让每个毕业生自己去宝库中挑选一套装备。

宝库中陈列着 nn 件珍贵的魔法物品,学过《魔法物品魔力值测量》课程的你一眼就看出了每件物品的魔力值 v_{i}vi,你必须至少选择 AA 件物品,但最多不能超过 BB 件物品作为你的毕业礼物。

一套装备的威力等于所有物品的平均魔力值,你渴望获取强大的威力,你想知道威力值最大是多少。

当然,除了你,还有其他学徒也在宝库中寻找着自己理想的魔法物品组合,也希望获得最强大的威力。你很好奇,是否还有其他学徒的装备能够达到与他相同的威力,即最大平均魔力价值。

请你求出最大威力值,和达到最大威力值的物品选取方案数。

输入

第一行三个整数 nnAABB,分别表示物品的数量,最少选取的物品数和最多选取的物品数量。

接下来一行,共 nn 个整数 v_{i}vi,表示一个魔法物品的魔力值。

输出

第一行一个浮点数,表示最大的威力值。输出应该和答案的相对误差、绝对误差相差不超过 10^{-6}10−6

第二行一个整数,表示达到最大威力值的物品选取方案数。

样例输入1

复制

4 2 3

10 20 10 10

样例输出1

复制

15.000000

3

提示

数据范围

对于 100 \%100% 的数据,1 \leqslant n \leqslant 50, 1 \leqslant A < B \leqslant n, 1 \leqslant v_{i} \leqslant 10^{15}1n50,1A<Bn,1vi1015

建议选手选择精度更强的数据类型以避免精度问题。

样例解释

选取魔力值为20 10 的物品可以使得平均魔力值,即威力值达到最大。

可以通过以下的三个选取方式达到最大的魔力值:\{1, 2\}, \{2, 3\}, \{2, 4\}{1,2},{2,3},{2,4}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值