Codeforces Round #710 (Div. 3)

Codeforces Round #710 (Div. 3)

A. Strange Table

题意:数列按照横排和竖排两种,告诉你行和列和位置x,求他在竖排的时候的数是多少
思路:画画图就出来鸟找规律。

#include<bits/stdc++.h>
#define int long long 
using namespace std;
signed main()
{
    
    
	int n,i,j,t,m,x;
	cin>>t;
	while(t--){
    
    
		cin>>n>>m>>x;
		int x1,y1;
		x1=(x%n?x%n:n)-1;
		y1=(x%n?x/n:x/n-1);
		int ans=x1*m+y1+1;
		cout<<ans<<endl;
	}
}

B. Partial Replacement

题意:给你一个由“”和“.”两种字符构成的字符串,要求把其中的一部分“**替换成“X”,且第一个和最后一个“”一定会被替换成‘X’,要求两个相邻的‘X’之间距离不超过k,保证有解,求最小替换次数。
思路:用两种下标去记录一种是目前能修改但是不用修改的下标,当遍历到需要修改的时候优先改之前记录的下标,模拟题,不过有细节处理有点多。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
	int n,i,j,k,t; 
	string s1;
	cin>>t;
	while(t--){
    
    
		cin>>n>>k>>s1;
		int cs=0,zd=0,cnt=0,f=0,mo=0;
		for(i=0;i<s1.length();i++) {
    
    
			if(s1[i]=='*'&&f==0)
				f=1,cs=i,cnt++;
			else if(s1[i]=='*')
				zd=i,cnt++;
		}
		if(cnt<=2) {
    
    
			cout<<cnt<<endl;
			continue;
		}
		else cnt=2;
		s1[cs]='X',s1[zd]='X';
		for(i=cs;i<=zd;i++){
    
    
			if(s1[i]=='*'){
    
    
				if(i-cs<=k){
    
    
					mo=i;
				}
				else {
    
    
					cs=mo; cnt++;
					mo=i;
				}
			}
			else if(s1[i]=='X'){
    
    
				if(i-cs<=k){
    
    
					cs=i;
				}
				else {
    
    
					cnt++,cs=i;
				}
			}
		}
		cout<<cnt<<endl;
	}
}

C. Double-ended Strings

题意:有两个字符串 a,b。我们每次操作可以将两个字符串中的一个字符串的最前面一个字符或这最后面一个字符删去(可以将某个字符串通过若干次操作变为空串)。求需要多少次操作才能够使 a,ba,b 两个字符串是相同的。
思路:想用暴力的可是觉得太麻烦了,看到题解发现有substr函数,然后搞了一通也没搞明白,但其实三重循环最外面用长度,然后里面用下标的起点暴力搞就行了。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    
    
	int n,i,j,t,k;
	string s1,s2,s3;
	cin>>t;
	while(t--){
    
    
		cin>>s1>>s2; 
		int ans=0;
		if(s1>s2) {
    
    
			s3=s1;
			s1=s2;
			s2=s3;
		}
		for(k=0;k<=min(s1.length(),s2.length());k++){
    
    
			for(i=0;i<s1.length();i++){
    
    
				for(j=0;j<s2.length();j++){
    
    
					if(s1.substr(i,k)==s2.substr(j,k)&&i+k<=s1.length()&&j+k<=s2.length()){
    
    
						ans=max(ans,k);
					}
				}
			}
		}
		ans=(s1.length()-ans)+(s2.length()-ans);
		cout<<ans<<endl;
	}
}

D. Epic Transformation

题意:n 个数,每次可以选择其中两个不同的数进行删除,求最后最少剩下多少个数。
思路:找规律的数论题叭,感觉比前面两个容易点= = ,手动模拟一下删数过程,会发现如果一个数出现的次数大于n/2次的话,那么数就是删不完的,否则如果是奇数就剩1,偶数就是0。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+100000;
int a[maxn];
int main()
{
    
    
	int n,i,j,t;
	cin>>t;
	while(t--){
    
    
		cin>>n;
		map<int ,int >mo;
		int ans=0;
		for(i=0;i<n;i++){
    
    
			cin>>a[i];	
			mo[a[i]]++;
			ans=max(ans,mo[a[i]]);
		}
		if(ans<=n/2){
    
    
			if(n%2==0)
				cout<<0<<endl;
			else 
				cout<<1<<endl;
			continue;
		}	
		else {
    
    
			if(ans==n)
				cout<<n<<endl;
			else {
    
    
				cout<<(n-((n-ans)*2))<<endl;
			}
		}
	}
}

猜你喜欢

转载自blog.csdn.net/RIPKEY/article/details/115308793