题目描述
因为奶牛们的节食运动(奶牛还节食?)给农夫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
说明
输入样例解释:
扫描二维码关注公众号,回复:
1007663 查看本文章
农夫JOHN有5批草料,4个农夫想要购买。他们出价分别为:每批草料为2,8,10和7。
输出样例解释:
农夫JOHN应该把价格设定为7,这样会有3个农夫会付钱买草料,农夫JOHN自己会挣到21的钱。
思路:
暴力枚举,John的出价可以在他邻居的出价中找,枚举John的出价,再枚举每一个农民的出价,得出购买的农民的数目,与John的出价相乘得到这种情况下John赚的钱……
(此处省略若干字)
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #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; }