此博客链接:https://www.cnblogs.com/ping2yingshi/p/12329156.html
复习时间(57min)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2078
Problem Description
为了能过个好年,xhd开始复习了,于是每天晚上背着书往教室跑。xhd复习有个习惯,在复习完一门课后,他总是挑一门更简单的课进行复习,而他复习这门课的效率为两门课的难度差的平方,而复习第一门课的效率为100和这门课的难度差的平方。xhd这学期选了n门课,但是一晚上他最多只能复习m门课,请问他一晚上复习的最高效率值是多少?
Input
输入数据的第一行是一个数据T,表示有T组数据。
每组数据的第一行是两个整数n(1 <= n <= 40),m(1 <= m <= n)。
接着有n行,每行有一个正整数a(1 <= a <= 100),表示这门课的难度值。
每组数据的第一行是两个整数n(1 <= n <= 40),m(1 <= m <= n)。
接着有n行,每行有一个正整数a(1 <= a <= 100),表示这门课的难度值。
Output
对于每组输入数据,输出一个整数,表示最高效率值。
Sample Input
2
2 2
52
25
12
5
89
64
6
43
56
72
92
23
20
22
37
31
Sample Output
5625
8836
题解:
此题特别考验语文功底,也许你前面浪费了据多时间,把思路用记事本或者纸记录下来,按照写的公式,各种情况赋值,当把题目值代入你算的公式里,你突然发现不对,哈哈哈,不对就对了。
注意:题目中给的m是一晚上最多只能复习m门课,这句话意思是也可以不复习m门课,比如只复习一门就睡大觉(结果也是每天只复习一门就睡觉了)。
方法:找难度最小的值。
思路:题目问他一晚上复习的最高效率值是多少?而选的n门课中,一晚上最多只能复习m门课,按照题目给的效率公式,我们可以用数字表示出来效率公式:
n=m=2 1 a 52 2 b 25 a>b (a-b)2=b1 27*27 (100-a)2=a1 48*48 max=a1+b1 n=3 m=2 1 a 2 b 3 c 从大到小排序 a>b>c a,b a,c b,c n=3 m=3 a,b,c (100-a)2=a1 (a-b)2=b1 --->(100-b)2=b2 (b-c)2=c1 (100-b)2=b2 max=a1+b2+c1 n=40 m=26 a-z max=(100-a)2+(100-b)2+(100-c)2+...+(100-y)2+(y-z)2<(100-z)2 公式1
但是复习多门课的效率和比只复习难度最小的一门课的效率低,即多门效率的和比100减去最小难度的平方的值小。这个也是我百度得来的,具体为啥以上公式1比100减去最小难度的平方值小,数学还没有证明出来。
代码如下:
#include<stdio.h> #include<math.h> #include<stdlib.h> #include<string.h> int main(void) { int t; scanf_s("%d", &t); while (t>0) { int N; int M; scanf_s("%d %d", &N, &M); int i; int min=100; int a; for (i = 0; i < N; i++) { scanf_s("%d", &a); if (min > a) min = a; } printf("%d\n",(100-min)*(100-min)); t--; } return 0; }