CF780(div3)补题。

C题:

题意:

CF780(div3)补题。_第1张图片

分析题意:

给一串字符串,为了使得最后得到一个字符串有偶数个元素,且奇数位置的元素i与i+1未知的元素一样,求最少删去多少个字母。

算法思路:

如果现在是这样:

aabcoo...因为oo连续,最后留下来的字符串要尽可能地长,无论oo后面如何排列,都不会出现删掉oo比删掉bc更符合题意的情况。

所以可以得出:我们要记录字母是否出现(用bool型数组),之后再出现的时候,把前面的元素都删掉就可以。然后每次得到这样一对,最终字符串的长度,len+=2 最终输出原先长度减去len即可。

#include 
#include 
using namespace std;
bool a[26];
int main()
{
	int T;
	cin>>T;
	while(T--){
		int number=0;
		string s;
		cin>>s;
		memset(a,false,sizeof(a));
		for(int i=0;i


D题:

题意:

CF780(div3)补题。_第2张图片

CF780(div3)补题。_第3张图片

题意·:

对于每一个数组,所有值,由0,1,-1,2,-2组成,问从第一个开始删几个,从最后一个开始删几个,可以使得剩下的数字的乘积最大。

思路:

首先,因为0的存在,会把整个数组分成若干个区间,然后对于每一个区间,要进行判断,而可以知道其实只需要记录2,-2的数量就可以了,为了让乘积最大,所以还要让里面的负数的个数是偶数,即记录一下负数的个数,如果是偶数,可以直接判断2的数量,如果不是偶数就要删一个负数,这个负数要删除从头开始最先出现的负数,与从尾部开始最先出现的,这样的才满足题意。  还有一点,如果没有满足题意的,就把数组全部删了,然后结果是1,这样的话,我们可以默认初值,L=n,R=0。就可以避免这种情况了。

代码:

#include 
using namespace std;
int a[200005];
int L,R;
int n;
//剩下的那一组序列,开头和结尾分别是第几列。
int max1;//存储当前最大的2的数量。 
void finish(int x,int y){//这一部分就是对对于一段的数据,只判断2的数量,多了就是最优解,少了就不是,直街跳过。 
	int time=0;
	for(int i=x+1;imax1){
		max1=time;
		L=x,R=n+1-y;
	}
} 
int count(int x,int y){//判断负数的个数。
	int number=0; 
 	for(int i=x+1;i=0) r1++;//得到的r1是出现的最早的负数。然后也是要删除的那个。 
		finish(r1,y);
		int r2=y;
		while(a[r2]>=0) r2--;///r2是最晚出现的负数。 
		finish(x,r2); 
	}
}
void solve(){//处理一组数据 
	max1=0;
	cin>>n;
	L=n;
	R=0;
	for(int i=1;i<=n;i++) cin>>a[i];
	a[0]=a[n+1]=0;
	int number1,number2;
	int flag=0;//上一个0出现的位置 
	for(int i=1;i<=n+1;i++){
		if(a[i]==0){
			get(flag,i);//处理每一个区间。 
			flag=i;
		}
	} 
	cout<>T;
	while(T--){
		solve();	
	}
	return 0;
} 

E题:

题目:

 CF780(div3)补题。_第4张图片

CF780(div3)补题。_第5张图片

CF780(div3)补题。_第6张图片

题意:

一个矩阵,里面的数字都是1和0,可以随意的全部数字往上下左右移动,最后在正对角线上,必须全部是1,其余地方必须全部是0,如果不是就每一个位置,花费一brul。问最低的brul。

思路:

矩阵可以上下左右移动,那么就是找一个数字1分布最多的对角线,之后所有1的数量,减去这个数,就是外面的1,然后再加上对角线上的0的数量。所以要判断1分布最多的对角线,当然,这个对角线不一定非要是11,22,33.。。还可以是12,23,34,45.所以这样的话用一个check函数。

代码如下:

#include 
using namespace std;
char a[2005][2005];
int  n;
int check(int x){
	int sum=0;
	for(int i=1;i<=n;i++,x++){
		if(x>n) x-=n;
		sum+=a[i][x]-'0';
	}
	return sum;
}
int main()
{
	int T;
	cin>>T;
	while(T--){
		int sum=0;
		int ans=0;
		cin>>n;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				cin>>a[i][j];
				sum+=a[i][j]-'0';//总共的1的个数。 
			}
		}
		for (int i=1;i<=n;i++){
			ans=max(ans,check(i));
		} 
//		sum-ans //外面的1.
//		n-ans// 里面的0.
		cout<

 

 

 

 

你可能感兴趣的:(c++,算法)