Largest Beautiful Number CodeForces - 946E (贪心)
2024-10-08 14:17:20
题意:给定一个长度为偶数的数,输出小于它的最大的美丽数。如果一个数长度为偶数,且没有前导零,并存在一种排列是回文数的数为美丽数。给定的t个数长度总和不超过200000.
分析:
1、存在一种排列为回文数,即这个数包含的数字都是偶数个。
2、预处理出每个数字的个数。
3、从最右边一位依次往左枚举,当逐渐减小第i位时,统计目前的数中,第i位之前有多少个数字是奇数个,记为cnt。
4、因为第i位之后的数字可以随便填,所以如果第i位之后数字的个数大于等于cnt,那么则可以得出答案,大于的部分先用9填充,再从大到小依次用奇数个的数字填充即可。
5、如果枚举到最左边也没有答案,则直接输出数字长度-2个9即可。
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 200000 + 10;
char s[MAXN];
map<int, int> mp;
int len;
vector<int> v;
bool judge(){
for(int i = len - 1; i >= 0; --i){
int t;
if(i == 0) t = 1;
else t = 0;
--mp[s[i] - '0'];
for(int j = s[i] - '0' - 1; j >= t; --j){
++mp[j];
v.clear();
for(int k = 0; k < 10; ++k){
if(mp[k] & 1){
v.push_back(k);
}
}
int l = v.size();
if(l <= len - i - 1){
for(int k = 0; k < i; ++k){
printf("%c", s[k]);
}
printf("%d", j);
for(int k = 0; k < len - i - 1 - l; ++k){
printf("9");
}
sort(v.begin(), v.end());
for(int k = l - 1; k >= 0; --k){
printf("%d", v[k]);
}
printf("\n");
return true;
}
--mp[j];
}
}
return false;
}
int main(){
int t;
scanf("%d", &t);
while(t--){
mp.clear();
scanf("%s", s);
len = strlen(s);
for(int i = 0; i < len; ++i){
++mp[s[i] - '0'];
}
if(!judge()){
for(int i = 0; i < len - 2; ++i){
printf("9");
}
printf("\n");
}
}
return 0;
}
最新文章
- Android立体旋转动画实现与封装(支持以X、Y、Z三个轴为轴心旋转)
- 精通Web Analytics 2.0 (6) 第四章:点击流分析的奇妙世界:实际的解决方案
- Android基于mAppWidget实现手绘地图(七)–根据坐标添加地图对象
- windows端口备忘
- CPS冥想 - 1 重新审视CPS
- poj3347Kadj Squares
- 菜鸟学习Hibernate——缓存
- TF-IDF与余弦相似性的应用(二):找出相似文章
- 开发部署一个简单的Servlet
- vmware vms migration to openstack
- poj1305:概念水题
- easyui datagrid datagrid-filter bug
- 安装Windows操作系统的驱动程序(驱动精灵版) - 进阶者系列 - 学习者系列文章
- SecureCRT连接虚拟机中的Linux系统(Ubuntu)_Linux教程
- [css 揭秘]:CSS编码技巧
- 如何避免 async/await 地狱
- 2016移动端Android新技术综合预览--好文不多,这一篇就足够
- Flask请求流程超清大图
- usrp使用
- CDOJ 1964 命运石之门【最短路径Dijkstra/BFS】