CF764模拟赛补题报告(Div.3)

注:只写了前四题,后面的有点难

文章目录

一、比赛分数

前两个题轻松AC,c题思路有问题,后面的题没有考虑。

二、使用步骤

第一题思路很简单,求最大值与最小值的差值,第二题就是几个判断,开始没读题,但后来想通了就对了,第三题开始统计的思路错了,一直调到最后也没调出来,导致后面的题也没有看。

、解题报告

1.子集全加一

情况:赛中AC

题意:输入一串数字,每次操作可以选一些数字加1,是的这串数字都相等所需的最少操作次数

题解:找到最大值和最小值,相减就是答案

AC代码:

#include<bits/stdc++.h> 
#define CLOSE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define isd(c) ('0' <= (c) && (c) <= '9')
#define isa(c) ('a' <= (c) && (c) <= 'z')
#define isA(c) ('A' <= (c) && (c) <= 'Z')
#define mem(a, b) memset(a, b, sizeof a);
#define N 100005
#define M 2000005
#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define PI acos(-1)
#define endl "\n"
#define pii pair<int, int>
#define F first
#define S second
#define bug cout << endl << " .....here!...." << endl;
//#pragma GCC optimize("O3")
//#define Time (double)clock() / CLOCKS_PER_SEC <= 0.95
//using namespace __gnu_cxx;
//using namespace __gnu_pbds;
using namespace std;
ll a[N],maxx=-0x3f3f3f3f,minn=0x3f3f3f3f;//1
int main(){
	CLOSE;
	ll t;
	cin>>t;
	while(t--){
		ll n;
		cin>>n;
		maxx=-0x3f3f3f3f,minn=0x3f3f3f3f;
		for(int i=1;i<=n;i++){
			cin>>a[i];
			maxx=max(maxx,a[i]);
			minn=min(minn,a[i]);
		}
		cout<<maxx-minn<<endl;
	}
	return 0;
}

2.构造等差数列

情况:赛中AC

题意:给你三个整数,你可以让任意个整数乘以一个整数m,在不改变顺序的情况下,如果能使三个数形成等差数列,输出YES,否则输出NO。

题解:枚举四种情况,第一种是一开始就可以形成等差数列,第二种是第一个数乘上m后可以形成等差数列,第三种是第二个数乘上m后可以形成等差数列,第四种是第三个数乘上m后可以形成等差数列

AC代码:

#include<bits/stdc++.h> 
#define CLOSE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define isd(c) ('0' <= (c) && (c) <= '9')
#define isa(c) ('a' <= (c) && (c) <= 'z')
#define isA(c) ('A' <= (c) && (c) <= 'Z')
#define mem(a, b) memset(a, b, sizeof a);
#define N 100005
#define M 2000005
#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define PI acos(-1)
#define endl "\n"
#define pii pair<int, int>
#define F first
#define S second
#define bug cout << endl << " .....here!...." << endl;
//#pragma GCC optimize("O3")
//#define Time (double)clock() / CLOCKS_PER_SEC <= 0.95
//using namespace __gnu_cxx;
//using namespace __gnu_pbds;
using namespace std;
ll a[4];
int main(){
	CLOSE;
	ll t;
	cin>>t;
	while(t--){
		cin>>a[1]>>a[2]>>a[3];
		if(a[3]-a[2]==a[2]-a[1]){
			cout<<"yes"<<endl;
			continue;
		}
		if((a[2]-(a[3]-a[2]))%a[1]==0){
			if((a[2]-(a[3]-a[2]))/a[1]>0){
				cout<<"yes"<<endl;
				continue;
			}
		}
		if((a[3]+a[1])%2==0){
			if(((a[3]+a[1])/2)%a[2]==0){
				if(((a[3]+a[1])/2)/a[2]>0){
					cout<<"yes"<<endl;
					continue;
				}
			}
		}
		if((a[2]+(a[2]-a[1]))%a[3]==0){
			if((a[2]+(a[2]-a[1]))/a[3]>0){
				cout<<"yes"<<endl;
				continue;
			}
		}
		cout<<"no"<<endl;
	}
	return 0;
}

3.除以2变成一种全排列 

情况:对了一个测试点,补题正确

题意:给你一个由n个正整数组成的数组。你可以对它进行如下运算。
在一次操作中,你可以用a[i]/2替换数组 中的任何元素,即用除以的向下取整的部分代替 。看看能否通过一定次数的操作,使数组 变成一个由1到n的数字组成的排列。也就是说,数组包含了从1到n 的所有数字,每个数字都恰好包含一次。

题解:先循环看看每个数字在除以2后小于n的数字并用桶标记,随后从n到1处理,如果桶中为0,就不能实现,否则是n/2的桶加上桶中个数减1,进行递推,如果可行就能实现

AC代码:

#include<bits/stdc++.h> 
#define CLOSE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define isd(c) ('0' <= (c) && (c) <= '9')
#define isa(c) ('a' <= (c) && (c) <= 'z')
#define isA(c) ('A' <= (c) && (c) <= 'Z')
#define mem(a, b) memset(a, b, sizeof a);
#define N 100005
#define M 2000005
#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define PI acos(-1)
#define endl "\n"
#define pii pair<int, int>
#define F first
#define S second
#define bug cout << endl << " .....here!...." << endl;
//#pragma GCC optimize("O3")
//#define Time (double)clock() / CLOCKS_PER_SEC <= 0.95
//using namespace __gnu_cxx;
//using namespace __gnu_pbds;
using namespace std;
ll a[N],cnt[100],t[100],aa[100][100];
int main(){
	CLOSE;
	ll w;
	cin>>w;
	while(w--){
		memset(a,0,sizeof a);
		memset(t,0,sizeof t);
		ll n,flag=0;
		cin>>n;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		for(int i=1;i<=n;i++){
			while(a[i]>n){
				a[i]=a[i]/2;
			}
			t[a[i]]++;
		}
		for(int i=n;i>=1;i--){
			if(t[i]==0){
				cout<<"NO"<<endl;
				flag=1;
				break;
			}
			else{
				t[i/2]+=(t[i]-1);
			}
		}
		if(flag==0){
			cout<<"YES"<<endl;
		}
	}
	return 0;
}

4.涂色构造回文串

情况:补题正确

题意:你有一个由小写拉丁字母组成的字符串 。
你可以用1到k中的颜色给一些字母涂色。没有必要将所有字母都涂上颜色。但每种颜色都必须有一个字母涂成该颜色。
然后,你可以任意调换涂有相同颜色的两个字母,调换的次数不限。
之后,就生成了k个字符串,其中i个字符串将包含所有涂有i种颜色的字符,并按顺序写入字符串s中。
你的任务是给字符串中的字符着色,使生成的所有k字符串都是回文字符串,并且这些k字符串中最短的字符串的长度尽可能大。
如果需要说明,请阅读示例中第一个测试用例的解释。

题解:统计偶数次和奇数次出现过的字符的个数,如果偶数次出现的字符的个数是奇数,就让奇数次出现的加上2,如果偶数次大于奇数次,直接输出偶数次个数除以k乘以2,否则在基础上加1.

AC代码:

#include<bits/stdc++.h> 
#define CLOSE ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
#define isd(c) ('0' <= (c) && (c) <= '9')
#define isa(c) ('a' <= (c) && (c) <= 'z')
#define isA(c) ('A' <= (c) && (c) <= 'Z')
#define mem(a, b) memset(a, b, sizeof a);
#define N 100005
#define M 2000005
#define inf 0x3f3f3f3f
#define infll 0x3f3f3f3f3f3f3f3f
#define ll long long
#define ull unsigned long long
#define PI acos(-1)
#define endl "\n"
#define pii pair<int, int>
#define F first
#define S second
#define bug cout << endl << " .....here!...." << endl;
//#pragma GCC optimize("O3")
//#define Time (double)clock() / CLOCKS_PER_SEC <= 0.95
//using namespace __gnu_cxx;
//using namespace __gnu_pbds;
using namespace std;
ll a[N];
void solve(){
	ll n,k;
	string s;
	cin>>n>>k;
	cin>>s;
	memset(a,0,sizeof a);
	for(int i=0;i<s.size();i++){
		a[s[i]]++;
	}
	ll even=0,odd=0;
	for(int i='a';i<='z';i++){
		even+=a[i]/2;
		odd+=a[i]%2;
	}
	ll ans=(even/k)*2;
	odd+=2*(even%k);
	if(odd>=k){
		ans++;
	}
	cout<<ans<<endl;
}
int main(){
	CLOSE;
	ll t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

四、赛事总结

1.在一种思路做不下去的情况下尝试换一种思路。

2.仔细审题,不要拉下关键词语。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值