Codeforces Problemset 10E(#10 div.1 E)
来源:互联网 发布:火狐浏览器禁用js 编辑:程序博客网 时间:2024/06/05 16:34
25 10 5 2 1
4 3 1
6
有篇叫《A Polynomial-time Algorithm for the Change-Making Problem》的论文专门讲这个的。
链接
我稍微翻译了一下……
一个货币系统是一个有限整数集,c1>c2>..>cn,令cn=1,否则可能无解。
定义C为n元向量(c1,c2,..,cn),在C下一个非负整数x可用一个满足V·C=x,非负n元向量V表示。V的大小表示为|V|=V·(1,1,..,1)。
定义>为字典序的大于。
G(x)是x的贪心表示。
M(x)是x的最小且字典序最大表示。
V是U的子集当且仅当对于任意1<=i<=n,vi<=ui。
我们要证明存在G(x)!=M(x)。
引理:
若U=G(U·C),则对于任意V为U的子集,那么V=G(V·C)
若U=M(U·C),则对于任意V为U的子集,那么V=M(V·C)
证明:
U=G(U·C)。
V为U的子集。
对于任意V`·C=V·C
V`·C=V·C
(U-V+V`)·C=U·C
(U-V+V`)<=U (因为U是字典序最大的)
V`<=V (移项)
定义运算<<,A<<B,当且仅当|A|>|B|或者(|A|=|B|且A<B)。
显然运算<<满足<所满足的所有性质。
对于第二个引理证明可以仿照第一个。
对于一个货币系统,若存在最小的反例w使得G(x)!=M(x),定义A=G(x)=(a1,..,an),B=M(x)=(b1,..,bn),显然满足对于任意1<=i<=n,不存在ai>0且bi>0,因为若ai>0且bi>0,令ai和bi同时减一,通过引理我们可以知道,依然是贪心表示和最小表示,且不相等,那就存在更小的反例w-ci,与定义矛盾。
定义M(w)=(m1,..,mn),i为其第一个非零位,j为其最后一个非零位。
通过定义可得M(w)<G(w),那么gi=0,且存在之前的某位不为0,所以i>1。
定理
对于1到j-1号元素,M(w)的和G(c(i-1)-1)的相等。且M(w)的j+1到n号元素都为0。
证明:
因为G(w)第i位为0且非0位在更早的位置,那么说明w>=ci-1。
通过引理可得,M(w)在j位减一,依然还是最小表示,又因为不存在更小的反例,可得G(w-cj)=M(w-cj),那么G(w-cj)的i位之前全为0,所以
w-cj<c(i-1)<=w
定义V=(v1,v2,..,vn)=G(c(i-1)-1)。
c(i-1)-1>=ci,所以vi不等于0。所以我们可以将vi和mi同时减一来得到新的贪心表示G(c(i-1)-1-ci)和M(w-ci)=G(w-ci),从前面的证明中可以得知,c(i-1)-1-ci<w-ci,所以G(c(i-1)-1-ci)<G(w-ci)。某位同时加一不会影响字典序,所以有
V<M(w)
同时,我们可以将mj位减一,那么可以得到M(w-cj)=G(w-cj)。因为w-cj<=c(i-1)-1,所以可得G(w-cj)<=V。可以发现G(w-cj)和M(w)的区别只有第j位,所以如果在第j位前V与M(w)不同,那么他不可能字典序在二者中间。但是V<M(w),所以必须存在k>=j,vk<mk。但是m(j+1)..mn都是0,所以vj<mj。但是G(w-cj)<=V,所以mj -1<=vj。所以mj只能等于vj +1。
所以枚举i、j,然后验证即可。
#include <iostream>using namespace std;int n,i,j,k,c[411],x,y,z,o,ans;int main(){ ans=1 << 30; cin >> n; for (i=1;i<=n;i++) cin >> c[i]; for (i=2;i<=n;i++) for (j=i;j<=n;j++) { x=c[i-1]-1; y=0; for (k=i;k<=j;k++) { z=x/c[k]; x-=z*c[k]; y+=z; } x=c[i-1]-1-x+c[j]; o=x; y++; if (x<ans) { for (k=1;k<=n;k++) { z=x/c[k]; x-=z*c[k]; y-=z; } if (y<0) ans=o; } } if (ans==1 << 30) cout << -1; else cout << ans; return 0;}
- Codeforces Problemset 10E(#10 div.1 E)
- Codeforces Problemset 30E(#30 div.1 E)
- Codeforces Problemset 198E(#125 div.1 E)
- Codeforces ProblemSet 163E 解题报告
- Codeforces #276 div.1 E
- Codeforces #284 (Div.1 A~E & Div.2 A~E)
- 【模拟】NEERC15 E Easy Problemset (Codeforces GYM 100851)
- [构造] Codeforces 736E #382 (Div. 1) E. Chess Championship
- [Codeforces Round #325][Div.1 E]
- Codeforces Round #347 (Div. 1) E
- Codeforces Round #323 (Div. 1) E
- Codeforces Round #200 Div.1 E tree
- CodeForces #113 Div.2 E
- 【Codeforces Round #194 (Div. 1)】Codeforces 333E Summer Earnings
- Codeforces (869E || #439 Div.2 E || #439 Div.1 C)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces Problemset 98D(#78 div.1 D)
- Codeforces Problemset 98C(#78 div.1 C)
- Android多媒体分析(四)AudioManager
- Android多媒体分析(五)音乐播放器实例
- poj2481-树状数组
- Android多媒体分析(六)对AudioManager的一点补充
- Android_动态壁纸介绍
- Codeforces Problemset 10E(#10 div.1 E)
- TabHost和Tab
- AppWidget初步入门
- 如何成为一个出类拔萃的演讲者?
- AppWidget深入 AndroidMusic中的MediaAppWidgetProvider注释
- 数学求解之遗传算法
- Android中ADB server didn't ACK fail to start daemon
- Java Date Convert(long, String, Date)
- DateTime转成英文