http://codeforces.com/gym/100623/attachments H题

本文提供了一种解决特定Codeforces题目(编号100623)的算法策略,通过动态地添加数值以确保能从1到某个目标值范围内所有数都能由已有的数组合而成。该算法使用C++实现,详细展示了如何通过检查当前最大可凑数值与下一个目标数值之间的差距来决定是否需要插入新的数值。

http://codeforces.com/gym/100623/attachments H题
已经给出来的,包括后来添加的,都累加得到ans,那么从1~ans都是可以凑出来的,如果ans<a[now]-1,那么就添加一个ans+1,然后继续操作。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<queue>
 4 #include<algorithm>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<set>
 8 #include<map>
 9 #include<stack>
10 #include<cstring>
11 #define inf 2147483647
12 #define ls rt<<1
13 #define rs rt<<1|1
14 #define lson ls,nl,mid,l,r
15 #define rson rs,mid+1,nr,l,r
16 #define N 100010
17 #define For(i,a,b) for(long long i=a;i<=b;i++)
18 #define p(a) putchar(a)
19 #define g() getchar()
20 
21 using namespace std;
22 
23 long long n,m;
24 long long a[400],b[400000];
25 long long ans,cnt,now;
26 bool flag;
27 void in(long long &x){
28     long long y=1;
29     char c=g();x=0;
30     while(c<'0'||c>'9'){
31         if(c=='-')y=-1;
32         c=g();
33     }
34     while(c<='9'&&c>='0'){
35         x=(x<<1)+(x<<3)+c-'0';c=g();
36     }
37     x*=y;
38 }
39 void o(long long x){
40     if(x<0){
41         p('-');
42         x=-x;
43     }
44     if(x>9)o(x/10);
45     p(x%10+'0');
46 }
47 int main(){
48     freopen("key.in","r",stdin);
49     freopen("key.out","w",stdout);
50     in(n);in(m);
51     For(i,1,n)
52         in(a[i]);
53     sort(a+1,a+n+1);
54     if(a[1]!=1){
55         b[++cnt]=1;
56         ans++;
57         m--;
58     }
59     // if(m>0)
60     //     For(i,1,n-1){
61     //         ans+=a[i];
62     //         if(ans<a[i+1]-1){
63     //             b[++cnt]=ans+1;
64     //             ans+=ans+1;
65     //             m--;
66     //         }
67     //         if(!m)
68     //             break;
69     //     }
70     now=1;
71     while(m>0){
72         if(ans<a[now]-1){
73             b[++cnt]=ans+1;
74              ans+=ans+1;
75             m--;
76         }
77         else{
78             ans+=a[now];
79             now++;
80         }
81         if(now>n)
82             break;
83     }
84     while(m>0){
85         b[++cnt]=ans+1;
86          ans+=ans+1;
87         m--;
88     }
89     For(i,1,cnt)
90         o(b[i]),p(' ');
91     return 0;
92 }
View Code

 

转载于:https://www.cnblogs.com/war1111/p/10798556.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值