首页 > 其他分享 >CF昨天两场比赛补题目829+830(DIv2)

CF昨天两场比赛补题目829+830(DIv2)

时间:2022-10-24 15:13:42浏览次数:78  
标签:830 int CF long cin solved num 829 define

Codeforces Round #829 (Div. 2):

A:https://codeforces.com/contest/1754/problem/A

题意:给定一串由QA两个元素组成的字符串,判断是否Q的数量大于A的数量,如果是输出No,如果不是(这里分两种情况,一,Q和A的数量相等,二、A的数量大于Q的数量)则输出Yes;

做法:用标记数组记录当前位置的字符是否被记录过

从头开始遍历,如果碰到字符是Q,并且后面如果碰到A的话,就对Q和A的位置进行标记

然后用一个set来表示没有被记录过的字符集来记录Q 的个数

最后判断set是否为空就可以了

参考代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 5 const int N=1e2+10;
 6 int n;
 7 int t;
 8 string s;
 9 set<char>c;
10 bool vis[N];
11 void solved()
12 {
13     c.clear();
14     memset(vis,0,sizeof(vis));
15     cin>>n>>s;
16     for(int i=0;i<n;i++)
17     {
18         if(s[i]=='Q')
19         {
20             for(int j=i+1;j<n;j++)
21             {
22                 if(s[j]=='A'&&!vis[j])
23                 {
24                     vis[i]=true;
25                     vis[j]=true;
26                     break;
27                 }
28             }
29         }
30     }
31     for(int i=0;i<n;i++)
32     {
33         if(s[i]=='Q'&&!vis[i])
34         {
35             c.insert(s[i]);
36         }
37     }
38     if(c.empty())
39     {
40         cout<<"Yes"<<endl;
41     }
42     else
43     {
44         cout<<"No"<<endl;
45     }
46 }
47 signed main()
48 {
49     IOS;
50     cin>>t;
51     while(t--)
52     {
53         solved();
54     }
55     return 0;
56 }

其实写麻烦了,用cnt来消去QA的个数统计或者用栈来统计也是可以的,我这种做法纯属脑子有病。

B:https://codeforces.com/contest/1754/problem/B

题目大意:

给定一组数,来构造一组没有重复数字的数组,这个数组内实现的最大化,比如,

 

给定n=4的话,可以实现一组数据:2,4,1,3

min{|4−2|,|1−4|,|3−1|}=min{2,3,2}=2

做法:可以这样来构造,如果是n是偶数的话,就构造为(n/2+1,1),(n/2+2,2).......

如果是奇数的话,就在偶数的基础上末尾加一n就可以了;

这样构造的依据是连续元素的最小差值不大于 ⌊n/2⌋。

要做到这一点,证明更大的价值是无法实现的。考虑值为 ⌊n/2⌋+1 的排列元素。它将在构造的排列中至少有一个相邻元素。而这个元素与相邻元素的最大绝对差最多是⌊n/2⌋。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long 
 4 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 5 int t;
 6 const int N=1e3+10;
 7 vector<int>ans;
 8 /*int a[N];
 9 set<int>q;
10 vector<int>jishu;
11 vector<int>oushu;
12 void solved()
13 {
14     int n;
15     jishu.clear();
16     oushu.clear();
17     memset(a,0,sizeof(a));
18     cin>>n;
19     if(n<=3)
20     {
21         for(int i=1;i<=n;i++)
22         {
23             
24             cout<<i<<" ";
25         }
26         cout<<endl;
27         return ;
28     }
29     for(int i=1;i<=n;i++)
30     {
31         if(i%2!=0)
32         {
33             jishu.push_back(i);
34         }
35         else
36         {
37             oushu.push_back(i);
38         }
39     }
40     for(int i=0;i<oushu.size();i++)
41     {
42         cout<<oushu[i]<<" ";
43     }
44     for(int i=0;i<jishu.size();i++)
45     {
46         cout<<jishu[i]<<" ";
47     }
48     cout<<endl;
49 }*/
50 void solved()
51 {
52     int n;
53     cin>>n;
54     int cnt=n/2;
55     for(int i=1;i<=n/2;i++)
56     {
57         cout<<i+cnt<<" "<<i<<" ";
58     }
59     if(n&1)
60     {
61         cout<<n<<endl;
62     }
63     else
64     {
65         cout<<endl;
66     }
67 }
68 signed main()
69 {
70     IOS;
71     cin>>t;
72     while(t--)
73     {
74         solved();
75     }
76     return 0;
77 }

830:A:https://codeforces.com/contest/1732/problem/A

题意:给定一组数,要求实现这个数组内所有元素的最大公约数是1,可以进行这样的操作:

选定一个数a[i],让这个数a[i]=__gcd(a[i],i)而这样做的价值是n-i+1;

要求在实现所有元素的最大公约数都是1的前提下找出最小价值

做法:可以这样看,对于一组数来讲n-1和n的最大公约数肯定是1,而最小代价也无非是从这两个数里面取,所以说答案一定是小于等于3的

由此,我们用num来表示这组数据的最大公约数,如果是1的话答案自然就是0;

如果__gcd(num,n)==1(选择i=n)答案就是1

如果__gcd(num,n-1)(选择i=n-1)答案就是2;

其余情况就是3

之所以看后面两个数的原因,是因为给定的连续自然数可以实现相邻的自然数互质

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define int long long
 4 #define IOS ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 5 int t;
 6 const int N=30;
 7 int a[N];
 8 int b[N];
 9 int n;
10 vector<int>ans;
11 void solved()
12 {
13     cin>>n;
14     /*bool flag=false;
15     for(int i=1;i<=n;i++)
16     {
17         cin>>a[i];
18         b[i]=a[i];
19     }
20     if(n==1&&a[1]==1)
21     {
22         cout<<0<<endl;
23         return ;
24     }
25     else if(n==1&&a[1]!=1)
26     {
27         cout<<1<<endl;
28         return ;
29     }
30     for(int i=1;i<=n;i++)
31     {
32         b[i]=__gcd(a[i],i);
33         int j=1;
34         for(j=1;j<n;j++)
35         {
36             if(__gcd(b[j],b[j+1])==1)
37             {
38                 flag=true;
39             }
40             else
41             {
42                 flag=false;
43                 break;
44             }
45         }
46         if(j==n&&flag)
47         {
48             cout<<n-i+1<<endl;
49             return ;
50         }
51     }*/
52     int num=0;
53     for(int i=1;i<=n;i++)
54     {
55         cin>>a[i];
56         num=__gcd(a[i],num);
57     }
58     if(num==1)
59     {
60         cout<<0<<endl;
61         return ;
62     }
63     if(__gcd(n,num)==1)
64     {
65         cout<<1<<endl;
66     }
67     else if(__gcd(n-1,num)==1)
68     {
69         cout<<2<<endl;
70     }
71     else
72     {
73         cout<<3<<endl;
74     }
75 }
76 signed main()
77 {
78     IOS;
79     cin>>t;
80     while(t--)
81     {
82         solved();
83     }
84     return 0;
85 }

 

 

标签:830,int,CF,long,cin,solved,num,829,define
From: https://www.cnblogs.com/LQS-blog/p/16821496.html

相关文章

  • 拆解:AFEM-8231和SKY58290-20前端模块 苹果iPhone 14Pro Max
    近期,iFixit对苹果最新iPhone14的拆解终于完成了,认为这次iPhone14最值得点赞的不是更强的处理器,也不是卫星SOS功能和更大的摄像头,而是完全重新设计的内部结构——显示面......
  • Codeforces Round #830 (Div. 2)D2. Balance (Hard version)(数据结构)
    题目链接题目大意维护一个集合的mex,每次有三种操作:'+'x:将数x插入集合中'-'x:将数x移除集合'?'k:询问满足mex的数是k的倍数既集合中未出现的数中最小的数......
  • CF 1677D(Tokitsukaze and Permutations-冒泡排序)
    已知长度为n的排列,经过k次冒泡(每次把最大的数交换到最后)后,得到的新序列为.现在已知的某些地方的值,不知道的记,求合法原排列数。考虑和排列达成双射关系。且1次冒泡会导致......
  • Codeforces Round #829 (Div. 2) E // 概率dp
    题目来源:CodeforcesRound#829(Div.2)E-WishIKnewHowtoSort题目链接:Problem-E-Codeforces题意给定大小为\(n\)的仅包含\(0\)、\(1\)的数组\(a\),每......
  • Codeforces Round #830 (Div. 2)
    AB太简单了,不写解法了。CF1732CSheikh我们观察一下\(f(l,r)=\mathrm{sum}(l,r)-\mathrm{xor}(l,r)\)的性质。考虑假如一个数\(x\),对\(\mathrm{sum}\)的贡献为\(......
  • Codeforces Round #829 (Div. 2) E Wish I Knew How to Sort
    WishIKnewHowtoSort概率dp设计一个\(dp[i]\)表示还需要进行\(i\)次有效移动的概率何为有效移动?最后的数组是\(0\)在左边,\(1\)在右边因此只有把两个在错误......
  • Codeforces Round #829 (Div. 2) D Factorial Divisibility
    FactorialDivisibility模拟合....合成大西瓜?枚举每个阶乘因子,提取公因式之后有很多散着的\(1\),然后判断能不能合成当前倍数#include<iostream>#include<cstdio>#......
  • Codeforces Round #829 (Div. 1/Div. 2) 1753 A B C D 题解
    Div1A/2C.MakeNonzeroSum令最后每个\(a_i\)的系数为\(c_i\)(\(c_i=1/-1\)),发现只要满足\(c_1=1\)(下标从1开始),且c中没有两个-1相连,就一定能找出一种划分方式。那我......
  • CF380C Sereja and Brackets 题解 数列分块
    题目链接:​​https://codeforces.com/contest/380/problem/C​​题目大意:给定长度为\(n(\le10^6)\)的一个括号序列,有\(m(\le10^5)\)次询问,每次询问给定一个区间\([l,......
  • Codeforces Round #830 C1. Sheikh(Easy version)
    题意给定一个长为\(n\)的非负整数序列\(\{a_n\}\),求\(l,r\)使\(f(l,r)=\text{sum}(l,r)-\text{xor}(l,r)\)最大,若答案不唯一,使\(r-l\)尽可能小,若仍不唯一,输出任意答案。......