站外题求调(玄关,20pts/100pts)

题目总版

Innate_Joker @ 2024-11-23 20:17:10

题目描述

一次比赛中,所有参加比赛的选手都获得了一个分数 s 。已知有 c_1 同学得 1 分,c_2 个同学得 2 分……,c_m 个同学得 m 分。请你划定一个分数线 k,使得不低于分数线 k 的人数 n_1 和低于分数线 k 的人数 n_2 均在给定的一个范围 [x,y] 之内,即 x \le n_1 \le y,x \le n_2 \le y。保证 sk 一定是整数,且 1 \le s \le m,1 \le k \le m

输入

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

第一行仅有一个正整数 m;第二行包含 m 个整数 c_1 , c_2 ,…,c_m ,两两之间以空格分隔,数据保证至少有一个 c_i > 0;第三行包含两个用空格分隔的整数 xy

输出

输出到文件 score.out 中。

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

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;
}

by bin2014 @ 2024-11-26 16:47:19

这是第几题的?


|