• 20240716 Codeforces题目


    A - Split the Multiset

    题目

    多集是一组数字,其中可以有相等的元素,数字的顺序无关紧要。例如, { 2 , 2 , 4 } \{2,2,4\} {2,2,4} 是一个multiset。

    你有一个多集 S S S 。最初,multiset只包含一个正整数 n n n 。即 S = { n } S=\{n\} S={n} 。另外,还有一个给定的正整数 k k k

    在一次操作中,您可以选择 S S S 中的任意正整数 u u u ,并从 S S S 中删除一个 u u u 的副本。然后,在 S S S 中插入不超过 k k k 个正整数,使所有插入的整数之和等于 u u u

    找出使 S S S 包含 n n n 的最小操作次数。

    输入

    每个测试包含多个测试用例。第一行包含测试用例的数量 t t t ( 1 ≤ t ≤ 1000 1 \le t \le 1000 1t1000 )。下面是测试用例的描述。

    每个测试用例的唯一一行包含两个整数 n , k n,k n,k ( 1 ≤ n ≤ 1000 , 2 ≤ k ≤ 1000 1\le n\le 1000,2\le k\le 1000 1n1000,2k1000 )。

    输出

    对于每个测试用例,打印一个整数,这是所需的答案。

    AC代码

    #include
    using namespace std;
    #define int long long
    #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #define fi first
    #define se second
    #define PII pair<int,int>
    void solve()
    {
    	int n,k;cin>>n>>k;
        if(n==1)cout<<"0\n";
        else
        {
            int ans=0;
            while(n>k)
            {
                ans++;
                n=n-k+1;//每次消除k-1
            }
            cout<<ans+1<<'\n';
        }
    }
    signed main()
    {
    	IOS
    	int t;cin>>t;
    	while(t--)solve();
    	return 0;
    }
    

    B. Make Majority

    题目

    给定一个序列 [ a 1 , … , a n ] [a_1,\ldots,a_n] [a1,,an] ,其中每个元素 a i a_i ai 要么是 0 0 0 ,要么是 1 1 1 。您可以对序列应用多个(可能为零)操作。在每个操作中,您选择两个整数 1 ≤ l ≤ r ≤ ∣ a ∣ 1\le l\le r\le |a| 1lra (其中 ∣ a ∣ |a| a a a a 的当前长度)并将 [ a l , … , a r ] [a_l,\ldots,a_r] [al,,ar] 替换为单个元素 x x x ,其中 x x x [ a l , … , a r ] [a_l,\ldots,a_r] [al,,ar] 的大部分。

    这里,由 0 0 0 1 1 1 组成的序列的大部分定义如下:假设序列中分别有 c 0 c_0 c0 个零和 c 1 c_1 c1 个1。

    —如果为 c 0 ≥ c 1 c_0\ge c_1 c0c1 ,则多数为 0 0 0
    c 0 l t ; c 1 c_0lt;c_1 c0lt;c1 ,多数为 1 1 1

    例如,假设 a = [ 1 , 0 , 0 , 0 , 1 , 1 ] a=[1,0,0,0,1,1] a=[1,0,0,0,1,1] 。如果我们选择 l = 1 , r = 2 l=1,r=2 l=1,r=2 ,结果序列将是 [ 0 , 0 , 0 , 1 , 1 ] [0,0,0,1,1] [0,0,0,1,1] 。如果我们选择 l = 4 , r = 6 l=4,r=6 l=4,r=6 ,结果序列将是 [ 1 , 0 , 0 , 1 ] [1,0,0,1] [1,0,0,1]

    确定是否可以通过有限的操作生成 a = [ 1 ] a=[1] a=[1]

    输入

    每个测试包含多个测试用例。第一行包含测试用例的数量 t t t ( 1 ≤ t ≤ 4 ⋅ 1 0 4 1 \le t \le 4\cdot 10^4 1t4104 )。下面是测试用例的描述。

    每个测试用例的第一行包含一个整数 n n n ( 1 ≤ n ≤ 2 ⋅ 1 0 5 1\le n\le 2\cdot 10^5 1n2105 )。

    每个测试用例的第二行包含一个由 0 0 0 1 1 1 组成的字符串,描述序列 a a a

    可以保证所有测试用例的 n n n 之和不超过 2 ⋅ 1 0 5 2\cdot 10^5 2105

    输出

    对于每个测试用例,如果可以生成 a = [ 1 ] a=[1] a=[1] ,则打印YES。否则,打印NO。您可以在任何情况下输出答案(上或下)。例如,字符串yEs、yEs、yEs和yEs将被识别为积极响应。

    AC代码

    #include
    using namespace std;
    #define int long long
    #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    #define fi first
    #define se second
    #define PII pair<int,int>
    string s,t;
    void solve()
    {
        int n;cin>>n;
    	s.clear();cin>>s;
        t.clear();
        int a=0,b=0;
        for(int i=0;i<n;)
        {
            if(s[i]=='1')
            {
                t+=s[i];
                a++;//一个‘1’为一个‘1’
                i++;
            }
            else
            {
                b++;
                t+='0';
                while(i<n&&s[i]=='0')i++;//一段连续的‘0’为1个零
            }
        }
        if(a>b)cout<<"YES\n";
        else cout<<"NO\n";
    }
    signed main()
    {
    	IOS
    	int t;cin>>t;
    	while(t--)solve();
    	return 0;
    }
    

    C. Increasing Sequence with Fixed OR

    题目

    您将得到一个正整数 n n n 。找出满足下列条件的最长正整数序列 a = [ a 1 , a 2 , … , a k ] a=[a_1,a_2,\ldots,a_k] a=[a1,a2,,ak] ,并输出该序列:

    -所有 1 ≤ i ≤ k 1\le i\le k 1ik a i ≤ n a_i\le n ain
    a a a 严格递增。即所有 2 ≤ i ≤ k 2\le i\le k 2ik 都为 KaTeX parse error: Expected 'EOF', got '&' at position 4: a_i&̲gt;a_{i-1}
    —所有 2 ≤ i ≤ k 2\le i\le k 2ik 对应 a i   ∣   a i − 1 = n a_i\,|\,a_{i-1}=n aiai1=n ,其中 ∣ | 表示位或操作

    输入

    每个测试包含多个测试用例。第一行包含测试用例的数量 t t t ( 1 ≤ t ≤ 1000 1 \le t \le 1000 1t1000 )。下面是测试用例的描述。

    每个测试用例的唯一一行包含一个整数 n n n ( 1 ≤ n ≤ 1 0 18 1\le n\le 10^{18} 1n1018 )。

    它保证最长有效序列的长度总和不超过 5 ⋅ 1 0 5 5\cdot 10^5 5105

    输出

    对于每个测试用例,打印两行。在第一行中,打印构造序列 k k k 的长度。在第二行,打印 k k k 正整数,表示序列。如果有多个最长序列,则可以打印其中任何一个。

    AC代码

    #include
    using namespace std;
    #define int long long
    #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); 
    int popcount(int x)
    {
    	if(!x)return 0;// 如果 x 等于 0,则直接返回 0,因为二进制中没有任何位为 1。
    	int i=0;
    	while((x>>i & 1)==0)++i; // 从低位开始检查 x 的二进制表示,找到第一个为 1 的位。
    	return pow(2,i);// 返回一个值,该值是 2 的 i 次幂,即返回第一个为 1 的位所在的位数的幂次方。
    }
    void solve()
    {
        int n;cin>>n;
        vector<int>ans={n};
        int nn=n;
        while(nn)
        {
            int t=popcount(nn);// 2 的第一个 1 的位数幂
            nn-=t;
            if(n-t)ans.push_back(n-t);
        }
        cout<<ans.size()<<'\n';
        sort(ans.begin(),ans.end());
        for(auto x : ans)cout<<x<<' ';
        cout<<'\n';
    }
    signed main()
    {
        int t;cin>>t;
        while(t--)solve();
        return 0;
    }
    
  • 相关阅读:
    前端跨域问题的解决思路
    Qt/C++编写视频监控系统81-Onvif报警抓图和录像并回放
    Lua语言编写爬虫程序
    深入理解JVM虚拟机第七篇:类加载器与类加载过程
    基于javaweb的宿舍管理系统(idea+servlet+jsp+jdbc)
    软件项目实施方案文档
    java 单例模式
    机器学习笔记之高斯网络(二)高斯贝叶斯网络
    可以用来制作硬模空心耳机壳的胶粘剂有哪些种类?
    HTML+CSS+JS静态网页设计【篮球NBA介绍体育运动】web前端学生作业源码
  • 原文地址:https://blog.csdn.net/2302_80423900/article/details/140458963