注:只写了前四题,后面的有点难
一、比赛分数
前两个题轻松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.仔细审题,不要拉下关键词语。