1.数字多一点后面 f[i]数值秒变 4741824。
2.样例全过可提交后0pts。
3.验证过递推式没错(伦敦大雾
一次比赛中,所有参加比赛的选手都获得了一个分数 s 。已知有 c1 同学得 1 分,c2 个同学得 2 分……,cm 个同学得 m 分。请你划定一个分数线 k,使得不低于分数线 k 的人数 n1 和低于分数线 k 的人数 n2 均在给定的一个范围 [x,y] 之内,即 x≤n1≤y,x≤n2≤y。保证 s 和 k 一定是整数,且 1≤s≤m,1≤k≤m。
从文件 score.in 中读入数据。
第一行仅有一个正整数 m;第二行包含 m 个整数 c1,c2,……,cm ,两两之间以空格分隔,数据保证至少有一个 ci>0;第三行包含两个用空格分隔的整数 x 和 y。
输出到文件 score.out 中。
如果不存在满足条件的分数线,输出 0。否则,输出一个分符合题目要求的分数线。如果有多个答案,输出符合条件的答案中最小的那一个。
#include <cstdio>
#include <windows.h>
#include <iostream>
using namespace std;
int main() {
// freopen("score.in","r",stdin);
// freopen("score.out","w",stdout);
int m;
cin >> m;
int c[m + 1];
long long f[m + 1] {};
int total = 0;
for(int i = 1; i <= m; i ++ ) {
cin >> c[i];
total += c[i];
}
for(int i = 1; i <= m; i ++ ) {
f[i] = f[i - 1] + c[m - i + 1];
}
for(int i = 1; i <= m; i ++ ) {
cout << f[i] << ' ' << total - f[i] << endl;
}
int left,right;
cin >> left >> right;
for(int i = m; i >= 1; i -- ) {
int tempnary = total - f[i];
if((f[i] >= left && f[i] <= right) &&
(tempnary >= left && tempnary <= right)) {
cout << i;
goto Exit;
}
}
cout << '0';
Exit:
system("pause");
return 0;
}