A小红的删字符
题解:直接输出首位和最后一位
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
cout<<s[0]<<s[2];
return 0;
}
B小红的正整数
题解:利用散列的最简单应用,将每一位上的数字作为cnt数组的下标,cnt[i]是用来记录0~9每个数的个数,然后先遍历1~9输出首个cnt[i]不为0的下标,然后立马跳出循环,再然后输完从0~9的每一个数
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int cnt[10];
int main()
{
ll x;int temp;
cin>>x;
while(x>0)
{
temp = x%10;
cnt[temp]++;
x=x/10;
}
//sort(a,a+i);
for(int j=1;j<10;j++)
{
if(cnt[j]>0)
{
cout<<j;
cnt[j]--;
break;
}
}
for(int j=0;j<10;j++)
{
for(int k=0;k<cnt[j];k++)
{
cout<<j;
}
}
}
C小红构造回文
题解:已知一个仅由小写字母组成的字符串,长度不超过105105。保证输入的字符串是回文的
如果无解,请输出 -1。否则重排后的字符串。有多解时输出任意即可。
发现当回文串的长度<=3时候一定不满足题目要求:重排后的回文串与原文串不同。当>=4时候,分长度位奇偶去讨评论(下面的代码中count代表字符串中的不同的字母种类数),当长度为偶数时候,count<=1一定不满足要求,反之只需要交换前两个字符和后两个字符输出就可以了;当长度为奇数时,count<=2一定不满足要求,反之(和奇数操作一样),便可以了
#include<bits/stdc++.h>
using namespace std;
int cnt[150];
int main()
{
string s;
cin>>s;int count=0;
for(int i=0;i<s.size();i++)
{
cnt[(int)s[i]]++;
}
for(int i=97;i<=122;i++)
{
if(cnt[i]>0)count++;
}
if(s.size()<=3) {cout<<-1;return 0;}
if(s.size()%2==0)
{
if(count<=1)cout<<-1;
else
{
char str = s[s.size()-1];
s[s.size()-1] = s[s.size()-2];
s[s.size()-2] = str;
str = s[0];
s[0] = s[1];
s[1] = str;
for(int i=0;i<s.size();i++)
{
cout<<s[i];
}
}
}
else
{//cabac
if(count<=2)cout<<-1;
else
{
char str = s[s.size()-1];
s[s.size()-1] = s[s.size()-2];
s[s.size()-2] = str;
str = s[0];
s[0] = s[1];
s[1] = str;
for(int i=0;i<s.size();i++)
{
cout<<s[i];
}
}
}
return 0;
}
D小红整数操作
#include<bits/stdc++.h>19/
using namespace std;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);//以上三行可以不用写
int x,y,l,r;
cin>>x>>y>>l>>r;
int g = gcd(x,y);//
x=x/g;//除以最大公约数使得x尽可能小
y=y/g;//除以最大公约数使得y尽可能小
if(x>y){swap(x,y);}//交换使得x为小的,y为大的
//假设x=3 y=4 l=19 r=41
//19/3得到6但发现至少使得3*7才能使得x在[l,r]这个区间里面,即是向上取整
//下界毋庸置疑一定是r/y得到10
int minn = l/x + (l%x!=0);//下界一定是向上取整
int maxx = r/y;//上界一定是向下取整
cout<<max(0,maxx-minn+1);
//你想7个3使得x(使得x本身有7次不同的值,y一样)在区间里面,10个4使得y在区间里面,那么10个3也必然在区间里面
//所以x的倍数可以是[7,10],那么使得x本身能在区间里面的方案就有(上界-下界+1)种
//但可能种类会有负数的情况,所以输出max(maxx-minn+1)便是正确答案
}