https://codeforc.es/contest/1606/problem/C

先来个比较简单的。

大意是给出一个数组a,ai代表一种10^ai的纸币。给出一个数k,你需要找出无法用k个纸币来表示的最小正整数。

贪心的看待这个问题。

a次方和b次方,我们定义a和b为10^a,b,a<b。我们总能通过  ((a/b)-1)个纸币   加上 剩下的纸币。来凑出一个最小的无法被表示的正整数。

先排序,然后对于每个面额的纸币,总是用少于下一个能够整除的数量-1。

code:


void solve()
{
	ll n,k;
	cin>>n>>k;k++;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i] = qpow(10,a[i]);
	}
	//sort(a+1,a+n+1);
	ll ans = 0;
	for(int i=1;i<n;i++){
		if(k<a[i+1]/a[i]){
			ans+=k*a[i];
			cout<<ans<<endl;
			return;
		}
		ans+=a[i+1]-a[i];
		k-=a[i+1]/a[i]-1;
	}
	cout<<ans+a[n]*k<<endl;
}


https://codeforc.es/contest/552/problem/C

一个cf1900分的题。ACC用来做B题。

大意是给出一个数w,有w^0,w^1,w^2.......w^100,这些砝码。
你的任务是确定砝码能否称出n?

这样考虑这个问题
我们首先可以确定一个等式  n =  a1*w^0+a2*w^1+a3*w^2.......
对于任意一个ai ,它的值一定是0,1,-1. 即不放,左边,右边这些情况。
当a1 = 1 时 ,可以推出  n - a1*w^0 = 。。。。
把它转为w进制后,也就是n-1 需要整除一个w 。
对于1 和 -1 ,我们考虑减去或加上1然后整除这个数。如果存在无法整数则不可以。

code:


void solve()
{
	ll w,n;
	cin>>w>>n;
	if(w<=2){
		cyes;
		return;
	}
	while(n){
		if(!((n-1)%w)) n--;
		else if(!((n+1)%w)) n++;
		else if(n%w){
			cno;
			return;
		}
		n/=w;
	}
	cyes;
}