A.LuoTianyi and the Palindrome String
思路:当回文有不同元素是只用删掉一个不同元素就可以破坏回文。
#include<bits/stdc++.h>
using namespace std;
int t;
string a;
void slove(){
int len = a.size();
char tmp = a[0];
for (int i=0;i<(len-1)/2+1;i++){
if (tmp!=a[i]){
cout<<len-1<<endl;
return;
}
}
cout<<-1<<endl;
return;
}
int main(){
cin>>t;
while(t--){
cin>>a;
slove();
}
}
思路:获取能得到的最大值h1和次最大值l1,并且让最大值覆盖的范围最大(n-1)*(m-1)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll t,n,m,b[110000];
int main(){
cin>>t;
while(t--){
cin>>n>>m;
for (int i=1;i<=n*m;i++) cin>>b[i];
sort(b+1,b+n*m+1);
ll H1 = b[n*m]-b[1],L1 = b[m*n-1]-b[1];// 有负数的情况
if (n<m) swap(n,m);
if (H1<L1) swap(H1,L1);
ll ans = H1*(n-1)*m+L1*(m-1);
ll H2 = b[m*n]-b[1],L2 = b[m*n]-b[2];// 无负数的情况
if (H2<L2) swap(H2,L2);
ans = max(ans,H2*(n-1)*m+L2*(m-1));
cout<<ans<<endl;
}
}
- 考点:排序+贪心
- 思路:考虑三种情况:1.左边(指-1操作)先开始放,那么只能和插入(xi)操作配合;2.右边(指-2操作)先开始放,也只能和插入(xi)操作配合;3.先插入一个值,再在他的左右放。
- 如何实现:将会插入的值放入set(能自动排序);-1,-2使用map来记录出现次数;情况1就直接map[-1]+set.size()(因为放左边的操作碰到可以插入时,可以先插入再放左边),情况2同理map[-2]+set.size(),,情况3就遍历set,得到的一般式:set.size()+左边有几个空位最多放map[-1]+右边有几个空位最多放map[-2]。
#include<bits/stdc++.h>
using namespace std;
int t,n,m;
set<int> a;
map<int,int> mapp;
int main(){
cin>>t;
while(t--){
cin>>n>>m;
mapp[-1]=0;mapp[-2]=0;a.clear();
for (int i=1,num;i<=n;i++){
cin>>num;
if (num==-1||num==-2)
mapp[num]++;
else
a.insert(num);
}
int len = a.size();
int ans = max(min(mapp[-1]+len,m),min(mapp[-2]+len,m));
int l = 0;
for (auto tmp : a){
ans = max(ans,len+min(mapp[-1],tmp-l-1)+min(mapp[-2],m-tmp-(len-l-1)));
l++;
}
cout<<ans<<endl;
}
}
下面笔者能力不够搞不了了qwq
本文介绍了三个编程问题的解决方案:如何检查字符串是否为回文并删除一个字符使其非回文,如何在二维表格中找到最大和次大值以覆盖最大面积,以及如何在特定操作下优化表演顺序。这些问题涉及字符串处理、排序、贪心策略和数据结构的使用。
366

被折叠的 条评论
为什么被折叠?



