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; }