Codeforces Round #754 (Div. 2) A B C
A. A.M. Deviation
思路:统计$A,B,C$三个数的数量的和$mod3$如果是奇数输出$1$否则输出$0$,为什么没有2呢$?$因为他求的$d$函数是绝对值所以$abs(2-3)=1$
- 参考代码
#include<bits/stdc++.h>
using namespace std;
#define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define re register int
#define int long long
#define fer(i,a,b) for(re i = a ; i <= b ; i ++)
#define der(i,a,b) for(re i = a ; i >= b ; i --)
#define lowbit(x) (x&-x)
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a*b/gcd(a,b);}
typedef pair<int,int>PII;
typedef pair<int,string>PIS;
signed main(){
snow;
int t;
cin>>t;
while(t--){
int a,b,c;
cin>>a>>b>>c;
int sum=0;
sum=a+b+c;
if(sum%3==0)cout<<0<<endl;
else cout<<1<<endl;
}
return 0;
}
B. Reverse Sort
思路:这题我们很容易想歪,觉得是硬模拟,我也在这上面浪费了很多时间,其实仔细观察就会发现我们只需要统计一下$0$和$1$的个数,因为题目要求是生成不降序序列,那么最后形成的序列一定是固定的也就是前面都是0,后面都是1,那么我们只需要找一下违反规则的0和1的下标和个数将他们记录输出即可形成不降序序列。
- 参考代码
#include<bits/stdc++.h>
using namespace std;
#define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define re register int
#define int long long
#define fer(i,a,b) for(re i = a ; i <= b ; i ++)
#define der(i,a,b) for(re i = a ; i >= b ; i --)
#define lowbit(x) (x&-x)
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a*b/gcd(a,b);}
typedef pair<int,int>PII;
typedef pair<int,string>PIS;
void solve(){
int n;
cin>>n;
char s[1010];
cin>>s+1;
bool st=true;
for(int i=2;i<=n;i++){//判断是否已经是规则序列
if(s[i]<s[i-1])st=false;
}
if(st){//如果是的话输出返回
cout<<0<<endl;
return ;
}
if(n==1){//如果只有一个数直接输出返回
cout<<0<<endl;
return;
}
//正片开始:
int cnt=0;//统计违反规则的总个数
int cnt0=0,cnt1=0;//分别统计0和1违反规则的个数
for(int i=1;i<=n;i++){
if(s[i]=='0')cnt0++;
else cnt1++;
}
vector<int>S;
for(int i=1;i<=cnt0;i++){
if(s[i]=='1')S.push_back(i),cnt++;
}
for(int i=cnt0+1;i<=n;i++){
if(s[i]=='0')S.push_back(i),cnt++;
}
cout<<1<<endl;
cout<<cnt<<' ';
for(int i=0;i<S.size();i++){
cout<<S[i]<<' ';
}
cout<<endl;
}
signed main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
C. Dominant Character
$打表+暴力截取,复杂度O(n)$
- 参考代码
#include<bits/stdc++.h>
using namespace std;
#define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define re register int
#define int long long
#define fer(i,a,b) for(re i = a ; i <= b ; i ++)
#define der(i,a,b) for(re i = a ; i >= b ; i --)
#define lowbit(x) (x&-x)
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a*b/gcd(a,b);}
typedef pair<int,int>PII;
typedef pair<int,string>PIS;
string ss[11]={"aa","aba","aab","baa","aac","aca","caa","abca","acba","abbacca","accabba"};
void solve(){//有些重复了可以忽略,baa,aac等等。
int n;
cin>>n;
string s;
cin>>s;
//四个操作就是进行对长度分别为2,3,4,7的操作
for(int i=1;i<s.size();i++){
string g=s.substr(i-1,2);
for(int j=0;j<9;j++){
if(g==ss[0]){
cout<<2<<endl;
return ;
}
}
}
for(int i=2;i<s.size();i++){
string g=s.substr(i-2,3);
for(int j=1;j<7;j++){
if(g==ss[j]){
cout<<3<<endl;
return ;
}
}
}
for(int i=3;i<s.size();i++){
string g=s.substr(i-3,4);
for(int j=7;j<9;j++){
if(g==ss[j]){
cout<<4<<endl;
return ;
}
}
}
for(int i=6;i<s.size();i++){
string g=s.substr(i-6,7);
for(int j=9;j<11;j++){
if(g==ss[j]){
cout<<7<<endl;
return ;
}
}
}
//如果都没有那么返回-1
cout<<"-1"<<endl;
return;
}
signed main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
总结:感觉这一场上分还是靠$手速+思维$,$A$好签,$B$和$C$还是容易出问题,$B$容易想歪,$C$的长度为$7$很容易忽视掉,还是得多练。
C的打表应该怎么写呢Orzs
列一下满足条件的,一共是7个我这里重复了一些,然后放进string数组,然后截取母串暴力cmp一下就好,如果都没有就返回-1否则返回长度
C这个代码不知道为什么wa2 呜呜呜
感觉你的好麻烦,理解下我的,暴力截取比较就好了。
B理解了,C压根没想到打表呜呜呜,打表也不知道怎么做,我纯暴力模拟但是不知道为啥wa2 了