列表

详情


NC229483. D 与集合

描述

D 给了你 n 个整数 ,请将这  n 个整数划分为 k 个非空集合,使得每个集合的和非零,或判断无解。

输入描述

第一行两个正整数 n,k 
接下来一行 n 个整数,第 i 个数为 a_i 

输出描述

如果无解,输出一行一个字符串 NO;
否则,先输出一行一个字符串 YES,
之后 k 行,第 i 行先输出一个正整数 S,表示第 i 个集合的大小,之后再输出 S 个数,表示集合中的数,用空格隔开。

示例1

输入:

6 3
-1 -1 4 5 1 -4

输出:

YES
2 -4 5
3 -1 -1 1
1 4

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

pypy3 解法, 执行用时: 205ms, 内存消耗: 44108K, 提交时间: 2021-11-26 22:37:00

n, k = map(int, input().split())
nums = list(map(int, input().split()))
if k == 1:
    if sum(nums) != 0:
        print('YES')
        print(n, ' '.join(map(str, nums)))
    else:
        print('NO')
    exit()
pos, neg = [], []
zero = 0
for i in nums:
    if i > 0:
        pos.append(i)
    elif i < 0:
        neg.append(i)
    else:
        zero += 1
if n-zero < k:
    print('NO')
    exit()
print('YES')
while k > 2:
    if pos:
        print(1, pos.pop())
    else:
        print(1, neg.pop())
    k -= 1


def output(ns):
    print(len(ns), ' '.join(map(str, ns)))


if pos:
    if neg:
        output(pos)
        output(neg+[0]*zero)
    else:
        output([pos.pop()])
        output(pos+[0]*zero)
else:
    if neg:
        output([neg.pop()])
        output(neg+[0]*zero)

C++ 解法, 执行用时: 207ms, 内存消耗: 2324K, 提交时间: 2022-07-05 15:04:42

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=1e6;
int p[maxn],cnt;
int n,k,x,m,sum,num;
signed main()
{
	cin>>n>>k;
	for(int i=1;i<=n;i++){
		cin>>x;
		if(!x)num++;
		else p[++cnt]=x,sum+=x;
	}
	if(!sum&&k==1||num>n-k){
		cout<<"NO";
		return 0;
	}
	cout<<"YES"<<endl;
	sort(p+1,p+1+cnt);
	int A=cnt-k+1;
	int sum1=0;
	for(int i=1;i<=A;i++)
		sum1+=p[i];
	if(sum1==0)swap(p[1],p[cnt]);
	cout<<n-k+1<<" ";
	for(int i=1;i<=A;i++)cout<<p[i]<<" ";
	for(int i=1;i<=num;i++)cout<<0<<" ";
	cout<<endl;
	for(int i=A+1;i<=n;i++)cout<<1<<" "<<p[i]<<endl;
}

上一题