算法

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();
	}
	

D dp

https://www.luogu.com.cn/problem/CF1989D

posted on 2024-09-01 11:57  Hoshino1  阅读(2)  评论(0编辑  收藏  举报