挑战赛#28不全题解
2026-02-25 17:05:29
发布于:浙江
| 题目 | 个人难度 |
|---|---|
| T1 | 红 |
| T2 | 红 |
| T3 | 红 |
| T4 | 橙 |
| T5 | 灰 |
| T6 | 橙 |
T1
可以使用 reverse 函数进行字符串的反转操作。
signed main(){
int l,r;
string a;
read(l,r,a);
reverse(a.begin()+l-1,a.begin()+r);
write(a);
return 0;
}
T2
最多一次交换自己的相邻两个卡片
我们另开一个字符串,直接模拟每种交换情况即可。
注意判断不交换两个字符串相等的情况。(这里挂了两发)
signed main(){
string a,b;
read(a,b);
if(a==b){
write("Yes");
return 0;
}
for(int i=0;i<a.size()-1;i++){
string news=a;
swap(news[i],news[i+1]);
if(news==b){
write("Yes");
return 0;
}
}write("No");
return 0;
}
T3
纯大模拟,@wcqk的最爱,没啥好说的。
struct node{
int wins,i;
}sz[1005];
bool cmp(node a,node b){
if(a.wins==b.wins){
return a.i<b.i;
}return a.wins>b.wins;
}
signed main(){
int n,m;
char a[115][105];
read(n,m);
for(int i=1;i<=2*n;i++){
sz[i].i=i,sz[i].wins=0;
for(int j=1;j<=m;j++){
read(a[i][j]);
}
}for(int i=1;i<=m;i++){
for(int k=1;k<=n;k++){
int l=sz[2*k-1].i,r=sz[2*k].i;
if(a[l][i]=='C' and a[r][i]=='P' or a[l][i]=='G' and a[r][i]=='C' or a[l][i]=='P' and a[r][i]=='G'){
sz[2*k-1].wins++;
}else if(a[l][i]==a[r][i]){
continue;
}else sz[2*k].wins++;
}sort(sz+1,sz+2*n+1,cmp);
}for(int i=1;i<=2*n;i++){
write(sz[i].i,'\n');
}
return 0;
}
T4
我的思路是这样的
我们先计算出数组 中元素的累加值,因为新的数组 是由数组 无限复制得到的,我们可以计算出在经过了 轮复制粘贴后,还需要加多少才可以超过 ,最后输出 ,其中 为在经过 轮的粘贴后,按照数组顺序还需要相加的元素个数。
注意特判。
signed main(){
int n,a[1000005]={},x,sum=0;;
read(n);
for(int i=1;i<=n;i++){read(a[i]);sum+=a[i];}
read(x);
int ans=(x/sum)*n,num=a[1];
sum=x%sum;
for(int i=2;i<=n;i++){
if(num>sum){
ans+=i-1;
write(ans);
return 0;
}num+=a[i];
}write(ans+n);
return 0;
}
T5
赛时没想出来,随便用 map 胡了
signed main(){
map<int,short> a,b;
int n;
read(n);
for(int i=1;i<=n;i++){
int x,y;
read(x,y);
for(int j=x;j<=x+y-1;j++)a[j]++;
}for(auto i:a){
if(i.second<=n)b[i.second]++;
}for(int i=1;i<=n;i++)write(b[i],' ');
return 0;
}
T6
当时查了一个全排列函数 next_permutation,我们根据这个把数字的所有排列情况生成出来,在生成所有的分割情况,然后挨个判断就行。注意要写 do-while 循环(我也不知道为啥,反正查出来要这么用,怪我知识面浅了
)。
注意在计算分割区间为 的时候将他从大到小排列,这样计算出来的结果是最大的。同时记得判断分割后数都为 的情况。
#include <bits/stdc++.h>
using namespace std;
#define int long long
bool cmp(int a,int b){
return a>b;
}
vector<int> a;
char c;
int n=0,ans=0;
int sum(int l,int r){
auto b=a;
sort(b.begin()+l,b.begin()+r+1,cmp);
if(b[l]==0)return 0;
int num=0,idx=1;
for(int i=l;i<=r;i++){
num=num*10+b[i];
}return num;
}
signed main(){
while(cin >> c){
n++;
a.push_back(c-'0');
}//cout << n;
sort(a.begin(),a.end());
do{
for(int l=0;l<n-1;l++){
ans=max(sum(0,l)*sum(l+1,n-1),ans);
}
}while(next_permutation(a.begin(),a.begin()+n));
cout << ans;
return 0;
}
全部评论 6
1
3天前 来自 浙江
10
3天前 来自 浙江
03天前 来自 浙江
0今天不刷罐了,点赞都满了
3天前 来自 浙江
0
我帮你品鉴下T5
3天前 来自 湖北
0暂无评定大学习
3天前 来自 湖北
0true,没做出来
3天前 来自 浙江
0
T5 灰大学习
3天前 来自 湖北
0《灰》
3天前 来自 上海
01
3天前 来自 浙江
0没做出来当然是灰了
3天前 来自 浙江
0彳亍
3天前 来自 上海
0
d
3天前 来自 浙江
0





























有帮助,赞一个