社区讨论

【玄关】贪心求证明或证伪

学术版参与者 5已保存回复 14

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
14 条
当前快照
1 份
快照标识符
@m56kbnk0
此快照首次捕获于
2024/12/27 17:40
去年
此快照最后确认于
2025/11/04 23:18
4 个月前
查看原帖

题目描述

学校组织学生进行户外素质拓展活动,小T班级的同学正在操场上进行一个名为”扎堆“的小游戏。
首先班级里 nn 名同学的背后都贴着一个整数号码牌 ViV_i,游戏开始时,班主任会喊出一个整数数字 XX,在场的同学必须迅速”扎堆“,分成若干小队。
每个小队组成人数不限,可以是单独 11 个人,也可以所有人都聚成一队,自由组合。但是小队得分小于 XX 的小队会被淘汰。得分计算规则是:
小队得分=小队成员号码牌中最小的数字×小队成员人数小队得分=小队成员号码牌中最小的数字×小队成员人数
请问最多可能出现多少支小队达到得分要求?

输入格式

第一行一个整数 XX,表示班主任喊出的数字。
第二行一个整数 nn,表示参与游戏的学生人数。
接下来 nn 行,每行一个整数 ViV_i ,对应每个学生背后的号码牌数字。

输出格式

输出一个整数,表示最多能达到得分要求的小队数量。

思路

cntcnt 为当前小队的人数,设 cnt=0cnt=0
将数组从大到小排序,1n1\sim n 遍历数组,并将 ViV_i 加入这个小队,cntcnt 加一。当 xVi×cntx\le V_i\times cnt 时,ansans 加一,重置 cnt=0cnt=0
求大佬证明或证伪,谢谢!
CPP
#include<bits/stdc++.h>
using namespace std;
int x,n,cnt=0,ans;
int arr[1145144];
bool cmp(int a,int b) {
	return a>b;
}
int main()
{
	cin>>x>>n;
	for(int i=0;i<n;i++) {
		cin>>arr[i];
	}
	sort(arr,arr+n,cmp);
	for(int i=0;i<n;i++) {
		cnt++;
		if (cnt*arr[i]>=x) {
			ans++;
			cnt=0;
		}
	}
	cout<<ans<<endl;
}
(这份代码 AC 了,但不知道对不对)

回复

14 条回复,欢迎继续交流。

正在加载回复...