因为校集训队以cf成绩为分队指标,所以我决定刷刷div3和div2的ABC题(不涉及算法的题),不学习新的算法了,争取把cf分数打上去,这样才能得到尊重。
之前有一场div2我看错A题题意怎么也调不出来,直接自闭了,于是掉了一百多分...赛后补题发现真的不难(上分起码没啥问题)。
反正,现在训练切简单题目的速度和正确率。
早上virtual participate了这场比赛,只AC了三题....(C题竟然没写出来!!!)
补了题现在把题解挂出来。
A.Circle of Students
扫一遍就好了
#include<bits/stdc++.h> using namespace std; int a[205]; int main() { int q; cin>>q; while(q--) { int n; cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; bool f =true; for(int i=1;i<=n-1;i++) { if(a[i+1]-a[i]!=1&&a[i+1]-a[i]!=-1) { if((a[i+1]==n&&a[i]==1)||(a[i+1]==1&&a[i]==n))continue; else { cout<<"NO\n"; f=false; break; } } } if(f)cout<<"YES\n"; } return 0; }
B.Equal Rectangles
排序后,最小的乘以最大的就好了,顺便扫的过程中判断一下能不能构成矩形,即相邻的两个是否相等。
#include<bits/stdc++.h> using namespace std; int arr[1005]; int main() { int q; cin>>q; while(q--) { int n; cin>>n; for(int i=1;i<=4*n;i++) cin>>arr[i]; sort(arr+1,arr+1+4*n); int cnt=arr[1]*arr[4*n]; bool f=true; for(int i=1;i<=2*n;i+=2) { if(arr[i]*arr[4*n+1-i]!=cnt||arr[i]!=arr[i+1]||arr[4*n+1-i]!=arr[4*n-i]) { cout<<"NO\n"; f=false; break; } } if(f)cout<<"YES\n"; } return 0; }
C.Common Divisors
WDNMD一开始先看错题目,以为是最大的公约数,看了样例半天没想明白。
后来知道是公约数的个数,结果脑子抽到了循环暴力判断???
其实这个就一直gcd迭代下去,再把结果的因子数计算输出就行...(学了一手快速gcd,以后可以当板子了)
ps:记得long long
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn = 4e5+5; ll a[maxn]; ll qGCD(ll a, ll b) { if(a == 0) return b; if(b == 0) return a; if(!(a & 1) && !(b & 1)) // a % 2 == 0 && b % 2 == 0; return qGCD(a >> 1, b >> 1) << 1; else if(!(b & 1)) return qGCD(a, b >> 1); else if(!(a & 1)) return qGCD(a >> 1, b); else return qGCD(abs(a - b), min(a, b)); } int main() { ios::sync_with_stdio(false); ll n; cin>>n; ll g=0; for(int i=1;i<=n;i++) { cin>>a[i]; g=qGCD(a[i],g); } ll cnt = 0; for(ll i=sqrt(g);i>=1;i--) { if(g%i==0) { if(i*i==g)cnt++; else cnt+=2; } } cout<<cnt<<'\n'; return 0; }
D1.Remove the Substring (easy version)
数据范围小,所以可以从大到小枚举substring的长度,再从前往后枚举删除的位置,最后暴力判断子序列即可。
#include<bits/stdc++.h> using namespace std; int main() { ios::sync_with_stdio(false); string s,t; cin>>s>>t; int slen=s.length(),tlen=t.length(); if(slen==tlen) { cout<<0<<'\n'; return 0; } for(int i=slen-tlen-1;i>=0;i--) { for(int pos=0;pos+i<slen;pos++) { int p1=0,p2=0; while(p1<slen&&p2<tlen) { if(p1>=pos&&p1<=pos+i) { p1++; continue; } if(s[p1]==t[p2]) { p1++; p2++; } else { p1++; } // cout<<p1<<' '<<p2<<'\n'; } if(p2==tlen) { cout<<i+1<<'\n'; return 0; } else continue; } } return 0; }
D2.Remove the Substring (hard version)
看某位大佬的博客看懂了,看官方的英文题解和代码真的看自闭了,链接附在下面。
https://blog.csdn.net/qq_41608020/article/details/99552169
总之就是找到最左满足子序列和最右满足子序列,对于t串中相邻的字符,分别在最左满足序列和最右满足序列中找到符合的位置,相减即为删去的子串长度最大值(对于这两个相邻字符)。
然后从前往后扫一遍,预处理头尾,即可。
#include<iostream> #include<string> using namespace std; const int maxn=2e5+5; int rp[maxn]; int lp[maxn]; string s,t; int ans=0; void findrg() { int ps=s.length()-1; int pt=t.length()-1; while(pt>=0) { if(s[ps]==t[pt]) { rp[pt]=ps; ps--; pt--; } else { ps--; } } } void findlg() { int ps=0,pt=0; while(pt<t.length()) { if(s[ps]==t[pt]) { lp[pt]=ps; ps++; pt++; } else { ps++; } } } void solve() { int x=s.length()-lp[t.length()-1]-1;//预处理头尾 ans=max(x,rp[0]); for(int i=0;i<t.length()-1;i++)//扫一遍 { ans=max(ans,rp[i+1]-lp[i]-1); } cout<<ans<<'\n'; } int main() { ios::sync_with_stdio(false); cin>>s>>t; findrg(); findlg(); /*for(int i=0;i<t.length();i++) { cout<<rp[i]<<" "; } cout<<'\n';*/ /*for(int i=0;i<t.length();i++) { cout<<lp[i]<<" "; } cout<<'\n';*/ solve(); return 0; }
E.Boxers
先排序,然后搞个now,从1开始循环,判断每个数字是否能够出现。
#include<bits/stdc++.h> using namespace std; int arr[150005]; int main() { int n; cin>>n; for(int i=1;i<=n;i++) { cin>>arr[i]; } sort(arr+1,arr+1+n); int now=1,cnt=0; for(int i=1;i<=n;i++) { if(now-arr[i]>=-1&&now-arr[i]<=1) { now++; cnt++; } else { if(arr[i]-1>=now) { now=arr[i]; cnt++; } } } cout<<cnt<<'\n'; }
F1.Complete the Projects (easy version)
按bi的正负将输入的数据分成两组,按照规则排个序然后扫一遍判断就好了,排序规则看代码就好了
#include<bits/stdc++.h> using namespace std; struct state{ int a,b; }; bool cmp(state x,state y) { if(x.b>=0&&y.b>=0) { if(x.a!=y.a) return x.a<y.a; else return x.b<y.b; } else { return x.a+x.b>y.a+y.b; } } state po[105],ne[105]; int main() { ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); int cnt1=1,cnt2=1; int n,r; cin>>n>>r; int a,b; for(int i=1;i<=n;i++) { cin>>a>>b; if(b>=0) { po[cnt1].a=a; po[cnt1].b=b; cnt1++; } else { ne[cnt2].a=a; ne[cnt2].b=b; cnt2++; } } sort(po+1,po+cnt1,cmp); sort(ne+1,ne+cnt2,cmp); for(int i=1;i<cnt1;i++) { if(r<po[i].a) { cout<<"NO\n"; return 0; } else r+=po[i].b; } for(int i=1;i<cnt2;i++) { if(r<ne[i].a||r<0) { cout<<"NO\n"; return 0; } else r+=ne[i].b; } if(r>=0)cout<<"YES\n"; else cout<<"NO\n"; return 0; }
F2.Complete the Projects (hard version)
出了补。
over