首页 > 其他分享 >Codeforces Round 866 (Div. 2)(A~C)

Codeforces Round 866 (Div. 2)(A~C)

时间:2023-04-23 13:46:04浏览次数:50  
标签:题意 cin int Codeforces 866 111111 字符串 Div MEX

目录

A. Yura's New Name

题意

在字符串\(s\)中添加 "_" 或者 "^",使得\(s\)中的任意字符都必须为 "_" 或者 "^^" 的一部分,求最少要添加的字符数量

思路

  • 当字符串头部为 "_" 时,一定要在前面添加1个字符 "^"
  • 当字符串尾部为 "_" 时,一定要在后面添加1个字符 "^"
  • 当字符串中出现连续两个"_"时,要在它们之间添加一个"^"
  • 注意当\(s\)为 "^" 时,再添加1个字符"^"即可

代码

#include<bits/stdc++.h>
using namespace std;
const int N=110;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		string s;
		cin>>s;
		
		int cnt=0;
		if(s=="^")//特殊情况
		{
			cout<<1<<endl;
			continue;
		}		
		if(s[0]=='_')cnt++;
		if(s[s.size()-1]=='_')cnt++;
		
		for(int i=0;i<s.size()-1;i++)
		{
			if(s[i]=='_'&&s[i+1]=='_')cnt++;
		}
		
		
		cout<<cnt<<endl;
	}
	
	return 0;
}

B. JoJo's Incredible Adventures

题意

给定一个长度为\(n\)的\(01\)串,将字符串循环右移\(n\)次,得到一个矩阵。取一个最大的子矩阵,使得矩阵中的元素均为\(1\),求矩阵的最大面积。

  • 比如长度为\(3\)的字符串\(101\),循环右移\(3\)次,可得到如下的矩阵:

    1 0 1
    1 1 0
    0 1 1

思路

  • 显然,当字符串中只含有\(0\)时,答案为\(0\);只含有\(1\)时,答案为\(n*n\)。
  • 将字符串拼接到原字符串后面,统计最长的连续\(1\)的个数。假设最长的连续\(1\)的个数为\(k\),则矩阵的最大面积为\(\frac{(k+1)^2}{4}\)
    • 给出证明:如果存在\(a\times b\)的矩阵,通过观察可得,当字符串右移时,矩形长方向上出现 1 的次数减1,但是宽方向上加1,即满足关系式 \(a+b=k+1\)
1111    11111    111111
 1111    11111    111111    
  1111    11111    111111
   1111    11111    111111     
            11111    111111    
                      111111 

若要使 \(a\times b\) 最大,则有

\[\begin{align} a+b &\geq 2\sqrt{ab} \\\ ab &\leq \frac{(a+b)^2}{4}=\frac{(k+1)^2}{4} \end{align} \]

由此得证

代码

#include<bits/stdc++.h>
using namespace std;
const int N=110;
typedef long long ll;
int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		string s;
		cin>>s;
		
		int n=s.size();
	    if(s.find('0')==-1)//只有1
		{
			cout<<(ll)n*n<<endl;
			continue;
		}
		s+=s;//成环
		
		ll maxv=0;
		//求连续1的最长个数
		for(int i=0;i<s.size();i++)
		{
			if(s[i]=='0')continue;
			int j=i;
			while(j<s.size()&&s[j]=='1')j++;
			maxv=max(maxv,(ll)j-i);
			i=j-1;
		}
		
		cout<<(maxv+1)*(maxv+1)/4<<endl;
		
	}
	
	return 0;
}

C. Constructive Problem

题意

给定\(n\)个非负整数,执行一次操作,将其中一段连续的子数组修改为非负整数\(k\),问是否能使新序列的\(MEX\)值比之前恰好增加\(1\)。
\(MEX\):集合中未出现过的最小非负整数

思路

分类讨论

  • 若数组中有\(MEX+1\)存在,则一定要将\(MEX+1\)最早出现和最晚出现之间的数修改为\(MEX\),之后判断\(MEX\)是否比原来增加\(1\)即可
  • 若数组中不存在\(MEX+1\)
    • 若其他元素有重复,选择\(1\)个改为\(MEX\)即可
    • 若其他元素无重复,
      • 若有元素大于\(MEX+1\),则将该元素改为\(MEX\)即可
      • 若所有元素小于\(MEX+1\),则答案为\(No\)

代码

#include<bits/stdc++.h>
using namespace std;
const int N=110;
typedef long long ll;

int main()
{
	int T;
	cin>>T;
	while(T--)
	{
		int n;
		cin>>n;
		
		vector<int>a(n);
		
		map<int,int>mp;
		
		for(int i=0;i<n;i++)
		{
			cin>>a[i];
			mp[a[i]]++;
		}
		
		
		int mex;
		
		for(int i=0;;i++)
			if(!mp.count(i))
			{
				mex=i;
				break;
			}
		
		bool flag=false;
		if(!mp.count(mex+1))
		{
			for(int i=0;i<n;i++)
				if(mp[a[i]]>1||a[i]>mex)
				{
					flag=true;
					break;
				}
		}
		else{
			
			int start,ed;
			bool first=false;
			for(int i=0;i<n;i++)
			{
				if(a[i]==mex+1)
				{
					if(!first)first=true,start=i;
					ed=i;
				}
			}
			
			for(int i=start;i<=ed;i++)
			{
				mp[a[i]]--;
				mp[mex]++;
			}
			
			flag=true;
			for(int i=0;i<mex;i++)
				if(!mp[i])
				{
					flag=false;
					break;
				}
		}
		
		puts(flag?"Yes":"No");
		
	}
	
	return 0;
}

标签:题意,cin,int,Codeforces,866,111111,字符串,Div,MEX
From: https://www.cnblogs.com/zzmxj/p/17346301.html

相关文章

  • Codeforces Round 689 (Div. 2, based on Zed Code Competition)D.Divide and Summari
    题意:我们给定包含n个正整数的数组,我们可以对这个数组执行一些操作之后,可以让数组内元素的和成为我们想要的数。我们对数组的执行操作一共分为三个步骤,第一个步骤是我们首先计算出数组的中间值mid。这里mid的定义不是中位数也不是均值,而是最大值和最小值的均值。也就是mid=(min......
  • CF ER147 div.2
    A 简单计数题,判断前导零。#include<bits/stdc++.h>usingnamespacestd;intT;intmain(){ cin>>T; while(T--){ chars[10]; cin>>s; intn=strlen(s); intans=1; for(inti=0;i<n;i++){ if(s[i]=='?'&&a......
  • codeforces #864 div2 B
    GCDPartition这道题首先要解决一个问题,要把区间分成几块,可以证明分成两块是更优首先我们假设把区间分成了m(>=2)块b1,b2,b3,...,bm,则答案是gcd(b1,b2,b3,...,bm),则b1,b2是gcd(b1,b2,b3,...,bm)的倍数,那么b1+b2也是gcd(b1,b2,b3,...,bm)的倍数,所以gcd(b1,b2,......
  • AtCoder Regular Contest 114 F Permutation Division
    洛谷传送门AtCoder传送门这题居然是之前某场模拟赛(contest701)的T1……(@Vidoliga场切但是被卡常/bx)下面记\(m\)为原题面中的\(K\),\(a_i\)为原题面中的\(P_i\)。不难发现后手的策略是把所有段按照段的第一个数从大到小排序接在一起。考虑若\(a_1\lem\),则先手能把所......
  • Educational Codeforces Round 147 (Rated for Div. 2)
    EducationalCodeforcesRound147(RatedforDiv.2)链接EducationalCodeforcesRound147(RatedforDiv.2)A题如果第一位数是0,直接打印0如果第一位数是'?',有9个数可以选择,如果其他位数是'?',有10中情况选择,相乘就可以了#include<iostream>#include<algo......
  • CodeForces 34B Sale
    B- SaleTimeLimit:2000MS     MemoryLimit:262144KB     64bitIOFormat:%I64d&%I64uSubmit Status Practice CodeForces34BDescriptionOnceBobgottoasaleofoldTVsets.Therewere n TVsetsatthatsale.TVsetwithi......
  • C. Table Decorations(Codeforces)(规律)
    C.TableDecorationstimelimitpertestmemorylimitpertestinputoutputr red, g greenand b blueballoons.Todecorateasingletableforthebanquetyo......
  • CodeForces 34A Reconnaissance 2
     Reconnaissance2TimeLimit:2000MS     MemoryLimit:262144KB     64bitIOFormat:%I64d&%I64uSubmit Status Practice CodeForces34ADescriptionn soldiersstandinacircle.Foreachsoldierhisheight ai isknown.Areco......
  • codeforces round The Monster and the Squirrel 529B (数学规律)
    TheMonsterandtheSquirrelTimeLimit: 1000MS MemoryLimit: 262144KB 64bitIOFormat: %I64d&%I64uSubmit StatusDescriptionArithemonsteralwayswakesupveryearlywiththefirstrayofthesunandthefirstthingshedoesisfeedinghersqu......
  • 两个div在同一行显示CSS如何实现
    一般两个div同行显示可以用float:left和display:inline_block来实现 <divclass="div1">div1</div><divclass="div2">div2</div>.div1{width:200px;height:200px;text-align:center;line-height:200px;......