题目描述 :1s 256MB
有 n 个物品,第 i 个物品的价值为 wi,选择若干物品,这些物品的价值和为 S。
作为支付手段,希望选择一部分物品能精确地支付不大于 k 的所有金额,即任意 s 满足 1 ≤ s ≤ k 都有对应的选择方案使 S = s。
给定 k 的值,构造满足要求的序列 wi,使 n 尽可能小的前提下 wi 的和尽可能小输入格式
第一行一个整数 T,代表有 T 组测试数据。
每一组测试数据一行,1 个整数 k输出格式
对于每组测试数据
第一行一个整数 n
第二行输出满足要求的序列 wi,wi 为正整数,且按升序排列
1 ≤ T ≤ 1000
1 ≤ k ≤ 1018输入样例 复制
2 3 4
输出样例 复制
2 1 2 3 1 1 2
数据范围与提示
样例解释
对于第一组测试数据:1 = 1; 2 = 2; 1 + 2 = 3
对于第二组测试数据:1 = 1; 2 = 2; 1 + 2 = 3; 1 + 1 + 2 = 4
#include<bits/stdc++.h> using namespace std; const int mxn = 100; typedef long long ll; ll a[mxn]; int main() { int t,cnt=0,i; ll k,tem; scanf("%d", &t); while(t--){ cnt=0;tem=1; scanf("%lld",&k); //O(nlogn) while(k>tem){ //k>当前权值的话,权值还要再上一层,才能表示所有值。否则不用上升了,那剩余部分直接当一个数 a[++cnt]=tem; k-=tem; tem*=2; } a[++cnt]=k; sort(a+1,a+1+cnt); cout<<cnt<<endl; cout<<1; for(int i=2;i<=cnt;i++) printf(" %lld",a[i]); cout<<endl; } return 0; }
支付 。
最新推荐文章于 2024-07-12 18:56:03 发布