博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Codeforces Round #392(div 2) 758D (贪心)
阅读量:5889 次
发布时间:2019-06-19

本文共 1462 字,大约阅读时间需要 4 分钟。

orz 最近被水题卡+FST,各种掉rating

题目大意

一个数s它是n进制的,但是每一位不是用'A','B'....表示的,而是用10,11等等表示的,将它还原成十进制

这种表示方法显然会产生多解,然后求所有的解中最小的那个

 

这题一想就是贪心,但是一开始算法写渣了,改变思路以后才A的

简单来说就是从右边开始,把尽量多的数压到一位里面,这样会使数更小

压的思路可以这么考虑

每次新加进来一个数,如果加进来以后,已经大于原来的那个数,那么就找截取一段可行的最大数

这样考虑的目的是处理前导0带来的影响

0也有可能是单独的一位,也有可能与其他数压到同一位里

想清楚这个以后就不难写了

 

#include 
#include
#include
using namespace std;typedef long long ll;string str, n;ll last, w;bool compare(int x, int y){ if(y-x > n.length()) return true; if(y-x < n.length()) return false; for(int i = x; i < y; i++) { if(str[i] == n[i-x]) continue; if(str[i] > n[i-x]) return true; else return false; } return true;}ll cal(string str, int x, int y){ ll ans = 0; for(int i = x; i < y; i++) ans = ans*10 + str[i] - '0'; return ans;}int main(){ cin>>n; cin>>str; ll ans = 0, k = 1; last = str.length(); for(int i = str.length()-1; i >= 0; i--) { while(compare(i, last)) { int j; for(j = i; j < last; j++) { if(str[j] == '0') continue; if(compare(j, last)) continue; j++; break; } j--; ans += cal(str, j, last)*k; last = j; k *= cal(n, 0, n.length()); } } if(last != 0) ans += cal(str, 0, last)*k; cout<
<

 

转载于:https://www.cnblogs.com/Saurus/p/6322598.html

你可能感兴趣的文章
单点登录加验证码例子
查看>>
[T-SQL]从变量与数据类型说起
查看>>
稀疏自动编码之反向传播算法(BP)
查看>>
二叉搜索树转换成双向链表
查看>>
WebLogic和Tomcat的区别
查看>>
java类中 获取服务器的IP 端口
查看>>
occActiveX - ActiveX with OpenCASCADE
查看>>
redmine
查看>>
css 序
查看>>
DirectshowLib摄像头拍照的”未找到可用于建立连接的介质筛选器组合“ 解决办法...
查看>>
wcf-1
查看>>
三种简单排序
查看>>
Dalvik VM和JVM的比较以及Android新的虚拟机ART
查看>>
【CSU 1803】2016
查看>>
SQLServer 批量备份与还原
查看>>
51Nod 1010 只包含因子2 3 5的数 Label:None
查看>>
Java中String和byte[]间的转换浅析
查看>>
什么是异步
查看>>
WordPress 主题切换
查看>>
cookie和session
查看>>