#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #include<set> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read(nm) freopen(nm, "r", stdin) #define write(nm) freopen(nm, "w", stdout) #define dump(x) cout<<#x<<" = "<<x<<endl using namespace std; #define take(args...) asdf,args #define debug(args...) asdfg,args; cout<<endl struct ASDF{ ASDF& operator,(int &a) { sf("%d", &a); return *this; } ASDF& operator,(long int &a){ sf("%ld", &a); return *this; } ASDF& operator,(long long int &a){ sf("%lld", &a); return *this; } ASDF& operator,(char &c){ sf("%c", &c); return *this; } ASDF& operator,(double &d){ sf("%lf", &d); return *this; } template<typename T> ASDF& operator,(T &a){ cin>>a; return *this; } }asdf; struct ASDFG{ template<typename T> ASDFG& operator,(vector<T> &v){ pf("["); cout<<v[0]; FOR(i, 1, SZ(v)){ cout<<", "<<v[i]; } pf("]"); return *this; } template<typename T> ASDFG& operator,(T x) { cout<<x<<" "; return *this; } }asdfg; //Header ends here #define MAXX 152 ll cnt[MAXX]; int main() { int kases, kaseno = 0; take(kases); int n, x; while(kases--) { take(n, x); mem(cnt, 0); cnt[0] = 1; int mx; loop(tt, n) { mx = 6*tt; for(int i=mx; i>-1; i--) { FOR(j, 1, 7) { cnt[i+j] += cnt[i]; } cnt[i] = 0; } } ll upre = 0, nice = 0; mx = 6*n; for(int i=x; i<=mx; i++) upre += cnt[i]; for(int i=1; i<x; i++) nice += cnt[i]; nice += upre; ll g = __gcd(upre, nice); upre /= g; nice /= g; pf("Case %d: ", ++kaseno); if(nice == 1) pf("%lld\n", upre); else pf("%lld/%lld\n", upre, nice); } }
Category Archives: Coin Change
(USACO) Stamps
0/* ID: himuhas1 TASK: stamps LANG: C++ */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<stack> #include<queue> #include<map> #include<vector> #include<sstream> #include<set> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define ll long long #define pb push_back #define MP make_pair #define mem(a, v) memset(a, v, sizeof(a)) #define fr first #define sc second #define all(v) v.begin(), v.end() #define SZ(a) (int(a.size())) #define INF (1<<29) #define paii pair<int, int> #define sf scanf #define pf printf using namespace std; #define MAXX 2000002 #define dump(x) cout<<#x<<" = "<<x<<endl int main() { freopen("stamps.in", "r", stdin); freopen("stamps.out", "w", stdout); int n, k, values[52]; sf("%d %d", &k, &n); loop(i, n) { sf("%d", &values[i]); } int dp[MAXX]; mem(dp, 1); dp[0] = 0; int mxSum = 0; int tmp; loop(i, n) { for(int j=0; j<=mxSum; j++) { if(dp[j] != 16843009 && dp[j]+1 <=k) { tmp = j + values[i]; dp[tmp] = min(dp[tmp], dp[j] + 1); mxSum = max(mxSum, tmp); } } } int res; for(res=0; res<=mxSum; res++) { if(dp[res] == 16843009 ) { break; } } res--; cout<<res<<endl; }
(USACO) Score Inflation
0/* ID: himuhas1 TASK: inflate LANG: C++ */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #include<set> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read(nm) freopen(nm, "r", stdin) #define write(nm) freopen(nm, "w", stdout) #define dump(x) cout<<#x<<" = "<<x<<endl using namespace std; #define take(args...) asdf,args #define debug(args...) asdfg,args; cout<<endl struct ASDF{ ASDF& operator,(int &a) { sf("%d", &a); return *this; } ASDF& operator,(long int &a){ sf("%ld", &a); return *this; } ASDF& operator,(long long int &a){ sf("%lld", &a); return *this; } ASDF& operator,(char &c){ sf("%c", &c); return *this; } ASDF& operator,(double &d){ sf("%lf", &d); return *this; } template<typename T> ASDF& operator,(T &a){ cin>>a; return *this; } }asdf; struct ASDFG{ template<typename T> ASDFG& operator,(vector<T> &v){ pf("["); cout<<v[0]; FOR(i, 1, SZ(v)){ cout<<", "<<v[i]; } pf("]"); return *this; } template<typename T> ASDFG& operator,(T x) { cout<<x<<" "; return *this; } }asdfg; //Header ends here #define MAXX 10002 ll best[MAXX]; int main() { #ifndef henapc read("inflate.in"); write("inflate.out"); #endif // henapc int given, cntGroups; int points, minitus; take(given, cntGroups); given++; loop(i, cntGroups) { take(points, minitus); FOR(i, minitus, given) { best[i] = max(best[i], best[i-minitus]+points); } } cout<<best[given-1]<<endl; return 0; }
(USACO) Money Systems
0/* ID: himuhas1 TASK: money LANG: C++ */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define gi(a) sf("%d", &a) #define gi2(a, b) sf("%d%d", &a, &b) #define gi3(a, b, c) sf("%d%d%d", &a, &b, &c) #define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read freopen("input.txt", "r", stdin) #define write freopen("output.txt", "w", stdout) using namespace std; #define MAXX 10002 ll dp[MAXX]; int main() { #ifndef hasibpc freopen("money.in", "r", stdin); freopen("money.out", "w", stdout); #endif int V, N; int coin; mem(dp, 0); dp[0] = 1; cin>>V>>N; loop(i, V) { cin>>coin; loop(i, N) { if(i + coin > N) break; dp[i+coin] += dp[i]; //cout<<(i+coin)<<endl; } } cout<<dp[N]<<endl; return 0; }
(USACO) Longest Prefix
0// link: http://cerberus.delos.com:790/usacoprob2?a=QX6ufTaKJ4D&S=prefix /* ID: himuhas1 TASK: prefix LANG: C++ */ #include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<cstdlib> #include<stdio.h> #include<algorithm> #include<vector> #include<map> #include<queue> #include<stack> #include<utility> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define gi(a) sf("%d", &a) #define gi2(a, b) sf("%d%d", &a, &b) #define gi3(a, b, c) sf("%d%d%d", &a, &b, &c) #define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d) #define all(v) v.begin(), v.end() #define pb push_back #define sf scanf #define pf printf #define mem(a, v) memset(a, v, sizeof(a)) #define dd double #define ll long long #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) using namespace std; #define NO_CHILD -2 #define NO_MAP -1 #define MAXX 200002 struct Trie{ map<int, map<int, int> > childNode; vector<bool>allNodes; int id; int *p; int zero; Trie() { allNodes.pb(0); zero = 0; } void add(const string &val) { p = &zero; int ch; loop(i, SZ(val)) { ch = val[i]; p = &childNode[*p][ch]; if(*p == 0) { *p = SZ(allNodes); allNodes.pb(0); } } allNodes[*p] = 1; } void iniCharByCharSearch() { id = 0; } int charByCharSearch(char ch) { if(childNode[id].find(ch) == childNode[id].end()) { return NO_CHILD; } else { id = childNode[id][ch]; return allNodes[id]; } } }; int main() { #ifndef hasibpc freopen("prefix.in", "r", stdin); freopen("prefix.out", "w", stdout); #endif // hasibpc Trie tr; string name; string str; while(1) { cin>>name; if(name[0] == '.') break; tr.add(name); } while(cin>>name) { str += name; } bool dp[MAXX]; mem(dp, 0); int ret; int result = 0; //dp[0] = 1; for(int i=-1; i<SZ(str); i++) { if(i==-1 || dp[i]) { result = max(result, i+1); tr.iniCharByCharSearch(); FOR(j, i+1, SZ(str)) { ret = tr.charByCharSearch(str[j]); //pf("%d %d ==> %d\n", i, j, ret); if(ret == 1) { //cout<<"j = "<< j<<endl; dp[j] = 1; //result = max(result, j+1); } if(ret == NO_CHILD) break; } } } cout<<result<<endl; return 0; }
(USACO) Subset Sums
0// link: http://cerberus.delos.com:790/usacoprob2?S=subset&a=bcquvHYkCVC /* ID: himuhas1 TASK: subset LANG: C++ */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define gi(a) sf("%d", &a) #define gi2(a, b) sf("%d%d", &a, &b) #define gi3(a, b, c) sf("%d%d%d", &a, &b, &c) #define gi4(a, b, c, d) sf("%d%d%d%d", &a, &b, &c, &d) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read freopen("input.txt", "r", stdin) #define write freopen("output.txt", "w", stdout) using namespace std; #define MAXX 392 int main() { //int p = 1512776590; //cout<<p<<endl; #ifndef hasibpc freopen("subset.in", "r", stdin); freopen("subset.out", "w", stdout); #endif int n; cin>>n; ll int dp[MAXX]; mem(dp, 0); dp[0] = 1; int maxn = 0; int mid = (n*(n+1))>>1; if(mid%2 == 1) { cout<<0<<endl; } else { mid = mid>>1; for(int i=1; i<=n; i++) { for(int j=min(maxn, mid-i); j>-1; j--) { if(i+j < MAXX) dp[i+j] += dp[j]; } maxn += i; } cout<<(dp[ mid ]>>1)<<endl; } return 0; }
(UVa) 222 – Budget Travel
0/* user: php time: 0.012 sec link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=158 */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<string> #include<stack> #include<queue> #include<map> #include<sstream> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) for(int i=0; i<n; i++) #define getint(n) scanf("%d", &n) #define pb(a) push_back(a) #define ll long long #define SZ(a) int(a.size()) #define read() freopen("input.txt", "r", stdin) #define write() freopen("output.txt", "w", stdout) #define mem(a, v) memset(a, v, sizeof(a)) #define all(v) v.begin(), v.end() #define pi acos(-1.0) #define INF 10000000000 #define mod abs #define pf printf #define sf scanf using namespace std; #define MAXX 52 + 1 double final_dist; double tank, miles_per_gallon; double dist[MAXX]; double cost[MAXX]; double mincost[MAXX][MAXX]; int cnt; double bfs_style() { loop(i, cnt+1) { FOR(j, i, cnt+1) { mincost[i][j] = INF; } } mincost[0][0] = cost[0]; for(int i=1; i<=cnt; i++) { double distance = dist[i]; if(distance <= tank * miles_per_gallon) { mincost[0][i] = mincost[0][0]; } loop(j, i) { distance = dist[i] - dist[j]; if(2 * distance >= tank * miles_per_gallon || ( i < cnt && (dist[i+1] - dist[j])/miles_per_gallon > tank) ) mincost[i][i] = min(mincost[i][i], mincost[j][i] + cost[i] * (distance/miles_per_gallon) ); } // mincost[i][i] += (cost[i] * tank); if(mincost[i][i] >= INF) continue; mincost[i][i] += 200; for(int j=i+1; j<=cnt; j++) { distance = dist[j] - dist[i]; if(distance <= tank * miles_per_gallon) { mincost[i][j] = mincost[i][i] ; } } } loop(i, cnt) { mincost[cnt][cnt] = min(mincost[cnt][cnt], mincost[i][cnt]); } return mincost[cnt][cnt]; } int main() { double result; int kaseno = 0; while(true) { cin>>final_dist; if(final_dist < 0) break; cin>>tank>>miles_per_gallon>>cost[0]>>cnt; cnt++; cost[0] = cost[0] * 100; dist[0] = 0; FOR(i, 1, cnt) { cin>>dist[i]>>cost[i]; } dist[cnt] = final_dist; result = bfs_style() + 0.5; result = (ll) result; result /= 100.0; pf("Data Set #%d\nminimum cost = $%.2lf\n", ++kaseno, result); } return 0; }
(UVa) 10032 – Tug of War
10/* user: php time: 0.216 sec link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=973 */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<string> #include<stack> #include<queue> #include<map> #include<sstream> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) for(int i=0; i<n; i++) #define getint(n) scanf("%d", &n) #define pb(a) push_back(a) #define ll long long #define SZ(a) int(a.size()) #define read() freopen("input.txt", "r", stdin) #define write() freopen("output.txt", "w", stdout) #define mem(a, v) memset(a, v, sizeof(a)) #define all(v) v.begin(), v.end() #define pi acos(-1.0) #define INF 1<<29 #define mod abs #define pf printf #define sf scanf using namespace std; #define MAXX 45000+2 int cnt, totalsum, half; ll dp[MAXX]; int weight[101]; ll bit; int main() { //read(); bool blank = false; int kases; getint(kases); while(kases--) { getint(cnt); totalsum = 0; loop(i, cnt) { getint(weight[i]); totalsum += weight[i]; } mem(dp, 0); dp[0] = 1<<0; loop(i, cnt) { for(int j=totalsum; j>-1; j--) { if(dp[j]) { dp[j + weight[i] ] |= (dp[j]<<1); } } } half = totalsum/2; bit = cnt/2; bit = 1LL<<bit; int aa; for(int i=half, j = half; i>-1 && j<=totalsum; i--, j++) { if((dp[i] & bit) ) { aa = i; break; } if((dp[j] & bit)) { aa = j; break; } } if(blank) pf("\n"); blank = true; pf("%d %d\n", min(aa, totalsum-aa), max(aa, totalsum-aa)); } return 0; }
(UVa) 10036 – Divisibility
0/* user: php time: 0.080 sec link: http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=977 */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<string> #include<stack> #include<queue> #include<map> #include<sstream> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) for(int i=0; i<n; i++) #define getint(n) scanf("%d", &n) #define pb(a) push_back(a) #define ll long long #define SZ(a) int(a.size()) #define read() freopen("input.txt", "r", stdin) #define write() freopen("output.txt", "w", stdout) #define mem(a, v) memset(a, v, sizeof(a)) #define all(v) v.begin(), v.end() #define pi acos(-1.0) #define INF 1<<29 #define mod(a) (a>0?a:-a) #define pf printf #define sf scanf using namespace std; #define MAXX 101 bool dp[MAXX]; int cnt, k; int main() { int kases; getint(kases); int n; int it; vector<int>vv; int len; while(kases--) { mem(dp, 0); getint(cnt); getint(k); getint(n); dp[abs(n)%k] = 1; FOR(i, 1, cnt) { getint(n); vv.clear(); loop(i, k) { if(dp[i]) { vv.pb(i); dp[i] = 0; } } len = SZ(vv); loop(i, len) { dp[ (abs(vv[i] + n))%k ] = 1; dp[ (abs(vv[i] - n))%k ] = 1; } } if(dp[0]) { pf("Divisible\n"); } else { pf("Not divisible\n"); } } return 0; }
(UVa) 624 – CD
0/* user: php time: 0.008 sec link: http://uva.onlinejudge.org/index.php?option=onlinejudge&page=show_problem&problem=565 */ #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<string> #include<stack> #include<queue> #include<map> #include<sstream> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) for(int i=0; i<n; i++) #define getint(n) scanf("%d", &n) #define pb(a) push_back(a) #define ll long long #define SZ(a) int(a.size()) #define read() freopen("input.txt", "r", stdin) #define write() freopen("output.txt", "w", stdout) #define mem(a, v) memset(a, v, sizeof(a)) #define all(v) v.begin(), v.end() #define pi acos(-1.0) #define INF 1<<29 #define mod(a) (a>0?a:-a) #define pf printf #define sf scanf using namespace std; #define MAXX 10000 bool dp[MAXX]; int cdused[MAXX]; int tracklen[22]; int total; int cnt; int coinchange() { mem(dp, 0); mem(cdused, 0); dp[0] = 1; int k; loop(i, cnt) { for(int j=total-1; j>-1; j--) { k = j + tracklen[i]; if(dp[j] == true && dp[k] == false) { dp[k] = true; cdused[k] = ((1<<i) | cdused[j]); } } } for(int i=total; i>-1; i--) { if(dp[i]) { return i; } } } int main() { int maxposs; while(sf("%d", &total) == 1) { getint(cnt); loop(i, cnt) { getint(tracklen[i]); } maxposs = coinchange(); loop(i, cnt) { if( (cdused[maxposs] & 1<<i) ) { pf("%d ", tracklen[i]); } } pf("sum:%d\n", maxposs); } return 0; }