算法
cf1989 ABCD
https://codeforces.com/contest/1989
B最长公共子序列
//相当于枚举以b[i]为起点遍历a的最长公共子序列
//因为是子序列所以 ab acccab 即使后面先取了第一个a也不影响最长长度
#include<bits/stdc++.h>
using namespace std;
void solve()
{
string a,b;
int maxn=-1;
cin>>a>>b;
int l,r;
int sa=a.size();
int sb=b.size();
for(int i=0; i<sb; i++)
{
l=0,r=i;
while(l<sa&&r<sb)
{
if(a[l]==b[r])
r++;
l++;
}
maxn=max(maxn,r-i);
}
cout<<sa+sb-maxn<<endl;
}
signed main()
{
int t;
cin>>t;
while(t--)
solve();
}
C 贪心
思路:
一个人对两个电影评分不一样时,去看评分高的一定最优,因为对另一个电影的贡献不是0就是-1,一定不会导致另一部电影的评分增加。
如果评分一样,我们就留到最后,让评分小的电影增加。
我们只需要让最小值增加即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
int a[maxn];
int b[maxn];
int c[maxn];
void solve()
{
int n;
cin>>n;
for(int i=1; i<=n; i++)cin>>a[i];
for(int i=1; i<=n; i++)cin>>b[i];
int suma=0,sumb=0;
int s=0;
for(int i=1; i<=n; i++)
{
if(a[i]>b[i]) suma+=a[i];
else if(a[i]<b[i]) sumb+=b[i];
else if(a[i]!=0) c[++s]=a[i];
}
for(int i=1; i<=s; i++)
{
if(suma>=sumb)
{
if(c[i]==1) sumb++;
else suma--;
}
else
{
if(c[i]==1) suma++;
else sumb--;
}
}
cout<<min(suma,sumb)<<"\n";
}
signed main()
{
int t;
while(t--)
solve();
}