题目链接

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;
    }
};