CF1157D N Problems During K Days

思路:

在1, 2, 3, ... , k的基础上贪心构造。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long ll;
 4 int a[100005];
 5 int main()
 6 {
 7     int n, k;
 8     while (cin >> n >> k)
 9     {
10         if (n < (ll)k * (k + 1) / 2) { cout << "NO" << endl; continue; }
11         if (k == 1) { cout << "YES\n" << n << endl; continue; }
12         if (k == 2 && n == 4) { cout << "NO" << endl; continue; }
13         for (int i = 1; i <= k; i++) a[i] = i;
14         ll r = n - k * (k + 1) / 2;
15         int d = r / k, t = r % k;
16         for (int i = 1; i <= k; i++) a[i] += d;
17         while (t && a[k] < a[k - 1] * 2) { a[k]++; t--; }
18         int i = k - 1;
19         for ( ; i > k - 1 - t; i--) a[i]++;
20         if (a[i + 1] > a[i] * 2) cout << "NO" << endl;
21         else
22         {
23             cout << "YES" << endl;
24             for (int i = 1; i <= k; i++) cout << a[i] << " ";
25             cout << endl;
26         }
27     }
28     return 0;
29 }

 

转载于:https://www.cnblogs.com/wangyiming/p/10801226.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值