NC229483. D 与集合
描述
输入描述
第一行两个正整数 , 。接下来一行 个整数,第 个数为 。
输出描述
如果无解,输出一行一个字符串 NO;否则,先输出一行一个字符串 YES,之后 行,第 行先输出一个正整数 ,表示第 个集合的大小,之后再输出 个数,表示集合中的数,用空格隔开。
示例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; }