1.New Palindrome CodeForces - 1832A
2.Maximum Sum CodeForces - 1832B
这道题倒是写了挺久,因为总是漏掉情况
题目就是问给出的字符串能否通过重新排序变成回文字符串(且不能和本身一样)
那么只需要考虑几种情况
1.重组不成回文字符串
2.符合回文字符串条件但只有一种情况且与本身重复
3.符合回文字符串条件且有多种组成方式
我们需要对字符串长度的奇偶进行判断,以及每个字母出现的次数(要用到出现次数的奇偶性)
重点看注释
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,cnt,ji,ncnt,u;
string s;
bool huiwen(string s)
{
for(int i=0,j=s.size()-1; i!=j; i++,j--)
if(s[i]!=s[j])
return false;
return true;
}
int main()
{
cin>>t;
while(t--)
{
cin>>s;
map<char,int> m;
char c[50];
cnt=0;
for(int i=0; i<s.size(); i++)
{
if(m[s[i]]==0)
{
c[cnt]=s[i];
cnt++;
}
m[s[i]]++;
}
//测试
//for(int i=0; i<cnt; i++){
// cout<<"第"<<i+1<<"个字母是"<<c[i]<<endl;
// cout<<"有"<<m[c[i]]<<"个"<<endl;
//}
if(cnt==1)//只有一种字母
{
cout<<"NO"<<endl;
continue;
}
ji=0;//统计有多少奇数个数的字母
u=0;
for(int i=0; i<cnt; i++)
{
if(m[c[i]]%2!=0)
{
ji++;
u=m[c[i]];
}
}
ncnt=s.size();//字符串长度
if(ncnt%2==1)//奇数长度
{
if(ji==1 &&cnt==2&& u==1 && huiwen(s))cout<<"NO"<<endl;
else if(ji>=1 && ncnt%2==0 )cout<<"NO"<<endl;
else if(ji>1)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
else if(ncnt%2==0) //偶数长度
{
if(ji!=0)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
}
}
return 0;
}
2.
这道题怎么说呢,可以说是暴力解决的,只需要枚举可执行方案就行,然后找出能得到最大值的方案,输出该最大值。
因为只有两种操作,即删除最小的两个数或者删除最大的一个数,这样的题目我们很容易想到先进行一个sort排序,那么删除哪个数也就是维护两端端点就行了。
一开始枚举每种情况计算两端点,再将两端点之间进行相加,可以过样例,但是会时间超限。
所以后面在排完序计算了前缀和,最后之间用前缀和计算总和过的。
代码很简单: