站外题求调(玄关,20pts/100pts)
  • 板块题目总版
  • 楼主Innate_Joker
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/23 20:17
  • 上次更新2024/11/23 22:11:49
查看原帖
站外题求调(玄关,20pts/100pts)
1086443
Innate_Joker楼主2024/11/23 20:17

题目描述

一次比赛中,所有参加比赛的选手都获得了一个分数 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 个整数 c1,c2,,cmc_1 , c_2 ,…,c_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/23 20:17
加载中...