玄关,累计前面的数字求低于这个下标数字个数的方法WA题目描述剪贴内
  • 板块灌水区
  • 楼主Innate_Joker
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/11/24 16:54
  • 上次更新2024/11/24 19:13:02
查看原帖
玄关,累计前面的数字求低于这个下标数字个数的方法WA题目描述剪贴内
1086443
Innate_Joker楼主2024/11/24 16:54

#1547

问题

1.数字多一点后面 f[i]数值秒变 47418244741824
2.样例全过可提交后0pts。
3.验证过递推式没错(伦敦大雾

题目描述

一次比赛中,所有参加比赛的选手都获得了一个分数 ss 。已知有 c1c_1 同学得 11 分,c2c_2 个同学得 22 分……,cmc_m 个同学得 mm 分。请你划定一个分数线 kk,使得不低于分数线 kk 的人数 n1n_1 和低于分数线 kk 的人数 n2n_2 均在给定的一个范围 [x,y][x,y] 之内,即 xn1yxn2yx \le n_1 \le y,x \le n_2 \le y。保证 sskk 一定是整数,且 1sm1km1 \le s \le m,1 \le k \le m

输入

从文件 score.in 中读入数据。

第一行仅有一个正整数 mm;第二行包含 mm 个整数 c1c_1c2c_2,……,cmc_m ,两两之间以空格分隔,数据保证至少有一个 ci>0c_i > 0;第三行包含两个用空格分隔的整数 xxyy

输出

输出到文件 score.out 中。

如果不存在满足条件的分数线,输出 00。否则,输出一个分符合题目要求的分数线。如果有多个答案,输出符合条件的答案中最小的那一个。

Code

#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;
}
2024/11/24 16:54
加载中...