题目链接
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; } };