洛谷 P2637 第一次,第二次,成交!

题目链接


题目描述

因为奶牛们的节食运动(奶牛还节食?)给农夫JOHN余下了一大批干草无法处理,所以他准备要开一个拍卖会去出售他的干草。他有N(1<=N<=1000)批干草(每批大约100捆)。他的客户有M个(1<=M<=1000),都是和他相邻的农夫。 第I名农夫会告诉农夫JOHN他会为农夫JOHN的每批干草付P_i的钱(1<=P_i<=1,000,000)。每个农夫都想买(也只想买)农夫JOHN的一批草料。 为了确保农夫们不会互相嫉妒,所以农夫JOHN决定要以一个固定的价格出售他的草料。每一个出价比农夫JOHN的要价要高的农夫将会买到草料,余下的将会被拒绝购买:< 请你帮助农夫JOHN找出能让他赚到最多的钱的最低的单批草料的售价。

输入输出格式

输入格式:

* 第一行:两个被空格隔开的整数,N和M * 第二行到第M+1行:第I+1行只包含一个整数:P_i

输出格式:

第一行:由空格隔开的两个整数:农夫JOHN能出的每批草料的最低价格,以及他能赚到的最多的钱

输入输出样例

输入样例#1:

5 4
2
8
10
7

输出样例#1:

7 21

说明

输入样例解释:

农夫JOHN有5批草料,4个农夫想要购买。他们出价分别为:每批草料为2,8,10和7。

输出样例解释:

农夫JOHN应该把价格设定为7,这样会有3个农夫会付钱买草料,农夫JOHN自己会挣到21的钱。


思路:

暴力枚举,John的出价可以在他邻居的出价中找,枚举John的出价,再枚举每一个农民的出价,得出购买的农民的数目,与John的出价相乘得到这种情况下John赚的钱……

(此处省略若干字)


代码:

#include
#include
#include
#include

#define maxn 1000010
#define loop( i, a, b )	for( int i = a; i <= b; i++ )

using namespace std;

int n, m, p[maxn];	//n是干草数,m是农民数,p数组是每个农民的出价。
int price, total, num, limited_p;	//price是John的出价,total是赚的钱。

int main() {
	scanf( "%d%d", &n, &m );
	loop( i, 1, m ) 
		scanf( "%d", &p[i] );
	loop( i, 1, m ) {
		num = 0;
		limited_p = p[i];	//John的出价完全可以在农民的出价中找。
		loop( j, 1, m ) {	//枚举每一个农民的出价。
			if( p[j] >= limited_p )
				num++;	//比John出价高,那么能买的人数+1 。
		}
		num = num > n ? n : num;	//防止卖的比John有的还多。
		if( num * limited_p > total ) {
			total = num* limited_p;
			price = limited_p;
		}
	}
	printf( "%d %d", price, total );
	return 0;
}

你可能感兴趣的:(模拟,枚举)