题目链接
https://ac.nowcoder.com/acm/contest/9715/B
解题思路
我裂开我看错数据规模了,以为1e10,所以先统计了一下,昨晚搞了将近一个小时没搞出来,直接心态爆炸,我好fw啊咋办。
直接暴力,求出a对应其他每一个字符的差值的绝对值,从小到大排序,选到k次位置,统计最大的选择个数。
AC代码1
//大佬代码
const int N=2000;
int ans,d[N];
class Solution {
public:
/**
*
* @param k int整型 表示最多的操作次数
* @param s string字符串 表示一个仅包含小写字母的字符串
* @return int整型
*/
int string2(int k, string s) {
// write code here
for(int i=97;i<=97+26;i++)
{
for(int j=0;j<s.size();j++)
d[j]=abs(i-int(s[j]));
sort(d,d+s.size());
int cnt=0,tk=k;
for(int j=0;j<s.size();j++)
if(d[j]<=tk) tk-=d[j],cnt++;
else break;
ans=max(ans,cnt);
}
return ans;
}
};AC代码2
/fw代码
#include<bits/stdc++.h>
#define ll long long
#define fi first
#define se second
using namespace std;
const int N=30;
typedef pair<int,int> pii;
ll cnt[N],ans,sum,k,t;
int vis[N];
string str;
void bfs(int x,int deep)
{
queue<pii> q;
q.push(pii(x,deep));
while(!q.empty())
{
int a=q.front().fi,dp=q.front().se;
q.pop();
if(vis[a]) continue;
ll tt=0;
if(dp) tt=min(t/dp,cnt[a]);
sum+=tt;
t-=tt*dp;
if(t<=0) return ;
vis[a]=1;
if(a>=2 && vis[a-1]==0) q.push(pii(a-1,dp+1));
if(a<=25 && vis[a+1]==0) q.push(pii(a+1,dp+1));
}
}
class Solution {
public:
/**
*
* @param k int整型 表示最多的操作次数
* @param s string字符串 表示一个仅包含小写字母的字符串
* @return int整型
*/
int string2(int k, string str) {
// write code here
for(int i=0;i<str.size();i++) cnt[str[i]-'a'+1]++;
for(int i=1;i<=26;i++)
{
sum=0;t=k;
memset(vis,0,sizeof vis);
bfs(i,0);
ans=max(ans,sum+cnt[i]);
}
return ans;
}
};
京公网安备 11010502036488号