Ability To Convert

题目链接:http://codeforces.com/contest/758/problem/D

cf392 div2的D题

题意大概就是给一个n进制,然后再给一串数字,把这串数字从右到左放在这些进制位上,每个位置上放的数字必须小于n,而且如果是0的话只能放一个0。最后问怎么放使得这个n进制的数字最小。


贪心一下,尽量先填满低位的数字,但是有很麻烦的判断地方就是假设某个进制放了几个0之后再放一个非0的数字就会超过n了,那么这个进制上就只能放一个0,

还有每个位置上的数字是不能带有前导0的,还有就是假设一个位置上放的0的个数已经超过了n的位数之后,就不用再放了,直接在这位上放一个0即可,否则有可能会爆long long。

总之是贪心加上好多挺麻烦的判断,我看好多dalao的代码是用dp过的,不太懂……

#include <bits/stdc++.h>
using namespace std;
long long p[200];
long long POW (long long  a , int  b)
{
	long long res = 1;
	while(b--)
	res *= a;
	return res;
}
int de(long long x)
{
	int res = 0;
	while(x)
	{ x /= 10 ; res ++ ;}
	return res ;
}
int main() {
	long long n ;
	string k;
	cin>>n>>k;
	int dem = de(n);
	long long  ans = 0;
	int len = k.length();
	int p = 0;
	long long num = 0;
	int j = 0;
	int  judge = 0;
	for(int i = len - 1 ; i >= 0 ; )
	{
		long long  tmp =k[i] - '0';
		//cout<<num + num  + tmp *POW(10 , j)<<endl ;
		if(judge >= dem)
		{
			if(j>judge)
			{
				i += judge ;
				judge = 0 ;
				j = 0;
			}
			else
			{
			i += (judge - 1 );
			judge = 0;
			j = 0;
			}
			long long temp =  num * POW( n , p) ;
			ans += temp;
			num = 0;
			p ++ ;
		//	cout<<temp<<endl;
			continue ;
		}
		if(num  + tmp *POW(10 , j) < n)
		{
			num += tmp * POW(10 , j) ;
			if(tmp == 0)judge  ++ ;
			else judge = 0;
		//	cout<<judge <<endl;
			if(i == 0)
			{
				ans += num * POW( n , p) ;
			//	cout<<num<<endl;
				break ;
			}

			++ j;
			i -- ;
		}
		else
		{
		//	cout<<judge<<" "<<j<<endl;
			if( judge >= 1 && j > judge ) i += (judge  ) , judge = 0;
			else if(judge >= 2) i+= (judge - 1) , judge = 0 ;
			j = 0;
			ans += num * POW(n , p );
		//	cout<<num<<endl;
			p++;
			num = 0;
		}
	}

	cout<<ans<<endl;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值