社区讨论

谷外题求调

学术版参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@lo1tm8bg
此快照首次捕获于
2023/10/23 02:47
2 年前
此快照最后确认于
2023/11/03 03:20
2 年前
查看原帖
题目描述 小学合唱团有N名团员,依次编号为1...N。合唱团的每个团员都有一个唱歌音高,其中第i名团员的音高为H[i],多名团员同时唱歌时,产生的音高是他们的音高之和。比如假设团员i的音高是5,团员j的音高是6,那么i和j一起唱歌时可以获得11的音高。如果某个团员X的音高可以通过其他团员一起唱歌得到,那么就可以不选择X。例如对于上面示例中的i和j,如果X的音高是11,那么X就可以不选择。最少需要选择多少名团员。
输入格式 第1行:一个整数N,表示合唱团团员数量。(1 <= N <= 500)。
第2行:N个空格分隔的整数,其中第i个整数H[i]表示团员i的音高(1 <= H[i] <= 100000)。
输出格式 输出共两行:
第1行:一个整数C,表示最少需要选择多少名团员。
第2行:C个空格分隔的整数,按照从小到大输出选出的C名团员的音高。
输入输出样例 输入样例1: 3 5 6 11 输出样例1: 2 5 6 【耗时限制】1000ms 【内存限制】256MB
CPP
#include<bits/stdc++.h>
using namespace std;
int h[500+10],t[500+10];
bool d[100000+10];
int main (){
	int n,maxn=0,cnt=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>h[i];
		maxn=max(maxn,h[i]);
	}
	sort(h+1,h+n+1);
	d[0]=1;
	for(int i=1;i<=n;i++){
		if(d[h[i]]==1)continue;
		for(int j=maxn;j>=h[i];j--){
			d[j]+=d[j-h[i]];
		}
	}
	for(int i=1;i<=n;i++){
		if(d[h[i]]==0){
			t[++cnt]=h[i];
		}
	}
	cout<<cnt<<endl;
	for(int i=1;i<=cnt;i++){
		cout<<t[i]<<" ";
	}
 	return 0;
}

回复

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

正在加载回复...