【玄关】贪心求证明或证伪
  • 板块学术版
  • 楼主Fish_redflying
  • 当前回复12
  • 已保存回复12
  • 发布时间2024/12/27 17:40
  • 上次更新2024/12/27 21:17:06
查看原帖
【玄关】贪心求证明或证伪
1029122
Fish_redflying楼主2024/12/27 17:40

题目描述

学校组织学生进行户外素质拓展活动,小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

求大佬证明或证伪,谢谢!

#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 了,但不知道对不对)

2024/12/27 17:40
加载中...