A
B
暴力构造,使用双指针扫描\(a,b\)串,记录最多的相同的个数\(maxn\),利用容斥原理减去即可,这里\(a\)串为辅,容易处理。
#include<bits/stdc++.h> using namespace std; using ll=long long; const int MAXN=2e5+10; void solve() { string a,b; cin>>a>>b; int j=0; int cnt=0; int tmp=0; int maxn=0; for(int i=0;i<b.size();i++) { int tmp=i; while(j<a.size()) { if(a[j]==b[tmp]) { ++j; ++cnt; ++tmp; } else ++j; } j=0; maxn=max(maxn,cnt); cnt=0; } cout<<a.size()+b.size()-maxn<<"\n"; } int main() { int t=1; cin>>t; while(t--) solve(); return 0; }
|
C
原来写了个很复杂的分类讨论,但是一直过不去。学习一下jiangly神的方法。
显然的,如果\(a_i>b_i\),补\(score1\),反之补\(score2\),如果相等呢,我们需要考虑后面数字的影响,这样考虑非常麻烦。
不妨先搁置下来,存到\(tmp\)中,后续再进行分配。如果\(a_i=b_i\):
- 为1,那么暂时加入到\(tmp\)中
- 为-1,那么\(score1、score2\)都减一,\(tmp\)加一(后面两者之中选择一个再补即可)。
那么最后\(score1、score2\)都是最低的基础分数了,我们只需要再将\(tmp\)进行分配即可。
#include<bits/stdc++.h> using namespace std; using ll=long long; const int MAXN=2e5+10; void solve() { int n; cin>>n; std::vector<int> a(n,0); std::vector<int> b(n,0); for(auto &t: a) cin>>t; for(auto &t: b) cin>>t; int score1=0,score2=0; int tmp=0; for(int i=0;i<n;i++) { if(a[i]>b[i]) score1+=a[i]; else if(a[i]<b[i]) score2+=b[i]; else { if(a[i]==1) tmp++; else if(a[i]==-1) { score1-=1; score2-=1; tmp++; } } } cout<<min({score1+tmp,score2+tmp,(score1+score2+tmp)>>1})<<"\n"; } int main() { int t=1; cin>>t; while(t--) solve(); return 0; }
|