零点工作室暑假集训(Educational Codeforces Round 151 (Rated for Div. 2))

目前只看懂了A题

A. Forbidden Integer

题意:给点 n, k,x用 1 ~ k 中除了 x 以外的任意数字,且每个数字可以使用任意次,去拼成 n 。

思路:分类讨论:

  • 如果除去x以后没有数字了,即可使用的数字为 0 ,则一定为NO 。
  • 如果除去x以后有数字:
    • 只有一个数字:只要这个数字是n的约数即可。
    • 至少两个数字:那么我们只考虑前两个数字,其可能的情况有三种,分别是:“1,2”,“1,3”,“2,3”,前两张情况因为有 1 ,所以直接用 n 个 1 即可,最后一种情况,“2,3”可以组成 ​ 的任意数字,但如果 n 为 1 怎么办?因为题目数据范围说了: k ≤ n ​,即 ​k 都已经至少为 3​ 了,所以 n​ 不可能为 ​1
  • AC代码:
  •  #include<bits/stdc++.h>
     
     using namespace std;
     
     typedef long long ll;
     typedef pair<int,int> pii;

     int main()
     {
         {
             int n,k,x;
             cin >> n >> k >> x;
             vector<int> v;
             for(int i = 1;i <= min(3,k);i ++)   
                 if(i == x)  continue;
                 else    v.push_back(i);
     
             if(v.size() == 0)   cout << "NO\n";
             else if(v.size() == 1)
             {
                 if(n % v[0] != 0)   cout << "NO\n";
                 else    
                 {
                     cout << "YES\n";
                     cout << n / v[0] << "\n";
                     for(int i = 1;i <= n / v[0];i++)
                         cout << v[0] << " \n"[i == n / v[0]];
                 }   
             }
             else
             {
                 if(v[0] == 1)
                 {
                     cout << "YES\n";
                     cout << n << "\n";
                     for(int i = 1;i <= n;i++)   cout << 1 << " \n"[i == n];
                 }
                 else
                 {
                     if(n % v[0] == 0)
                     {
                         cout << "YES\n";
                         cout << n / v[0] << "\n";
                         for(int i = 1;i <= n / v[0];i++)
                             cout << v[0] << " \n"[i == n / v[0]];
                     }
                     else
                     {
                         n -= 3;
                         cout << "YES\n";
                         cout << 1 + n / 2 << "\n";
                         cout << 3 << " ";
                         for(int i = 1;i <= n / 2;i++)
                             cout << v[0] << " \n"[i == n / 2];
                     }
                 }
             }
     
         }
         return 0;
     }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值