BZOJ2612 [Poi2003]Sums
来源:互联网 发布:sql server 2000精简版 编辑:程序博客网 时间:2024/05/09 14:16
任取一个物品,假设其体积为V,那么我们可以在模V的意义下做背包,f[i]表示对于模V得i的物品,当体积>=f[i]时能被表示出来
那么就可以跑最短路了
不妨取体积最小那个,dijkstra的话理论复杂度是(5000*50000)logn,但是跑的飞起
事实上我们可以取最大那个,然后令f[i]表示表示对于模V得i的物品,当体积>=f[i]*V时能被表示出来
这样的话边权都为0或者1,那么我们可以01bfs,理论复杂度(5000*50000),但是跑不过
dijkstra:
#include<iostream>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<cstdlib>#include<cstdio>#include<map>#include<bitset>#include<set>#include<stack>#include<vector>#include<queue>using namespace std;#define MAXN 50010#define MAXM 1010#define ll long long#define eps 1e-8#define MOD 1000000007#define INF 1000000000struct data{ int x; int v; data(){ } data(int _x,int _v){ x=_x; v=_v; } friend bool operator <(data x,data y){ return x.v>y.v; }};int n;int a[MAXN];int mn;int f[MAXN];priority_queue<data>q;bool vis[MAXN];void dijkstra(){ int i,x; memset(f,0x3f,sizeof(f)); f[0]=0; q.push(data(0,0)); while(!q.empty()){ x=q.top().x; q.pop(); if(vis[x]){ continue ; } vis[x]=1; for(i=1;i<=n;i++){ if(f[x]+a[i]<f[(x+a[i])%mn]){ f[(x+a[i])%mn]=f[x]+a[i]; q.push(data((x+a[i])%mn,f[(x+a[i])%mn])); } } }}int main(){ int i,j,x; scanf("%d",&n); for(i=1;i<=n;i++){ scanf("%d",&a[i]); } mn=a[1]; dijkstra(); scanf("%d",&n); while(n--){ scanf("%d",&x); printf(x>=f[x%mn]?"TAK\n":"NIE\n"); } return 0;} /*325760141232 */01bfs:
#include<iostream>#include<cstring>#include<ctime>#include<cmath>#include<algorithm>#include<iomanip>#include<cstdlib>#include<cstdio>#include<map>#include<bitset>#include<set>#include<stack>#include<vector>#include<queue>using namespace std;#define MAXN 50010#define MAXM 1010#define ll long long#define eps 1e-8#define MOD 1000000007#define INF 1000000000int n;int a[MAXN];int mx;int f[MAXN];int q[MAXN],hd,tl;int Q[MAXN],HD,TL;void bfs(){int i,x;memset(f,0x3f,sizeof(f));f[0]=0;q[tl++]=0;while(hd!=tl){Q[TL++]=q[hd++];int thd=HD;while(HD!=TL){x=Q[HD++];for(i=1;i<=n;i++){if(f[(x+a[i])%mx]>INF){if(x+a[i]<mx){f[x+a[i]]=f[x];Q[TL++]=x+a[i];}}}}HD=thd;while(HD!=TL){x=Q[HD++];for(i=1;i<=n;i++){if(f[(x+a[i])%mx]>INF){if(x+a[i]>=mx){f[x+a[i]-mx]=f[x]+1;q[tl++]=x+a[i]-mx;}}}}}}int main(){int i,j,x;scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&a[i]);}mx=a[n];bfs();scanf("%d",&n);while(n--){scanf("%d",&x);printf(x/mx>=f[x%mx]?"TAK\n":"NIE\n");}return 0;}/*325760141232*/
0 0
- BZOJ2612 [Poi2003]Sums
- Sums
- sums
- bzoj2430: [Poi2003]Chocolate
- bzoj1436: Poi2003 Trinomial
- 【bzoj2430】 [Poi2003]Chocolate
- BZOJ 2430 Poi2003 Chocolate 贪心
- BZOJ 2613 Poi2003 Shuffle 数论
- Java excel表 导出 POI2003
- [Poi2003 ][bzoj 2601]MAL猴子捞月
- 2Sums&3Sums
- Sums of Sums
- Alternating Sums
- Subset Sums
- Subset Sums
- Herd Sums
- Triangular Sums
- Subset Sums
- 混合APP开发的套路(三): android和javascript初步交互(js调安卓)
- 总结的common.js
- 剑指offer25:二叉树中和为某一值得路径
- Mysql无法使用范围查询列之后的其他索引列(以及5.6版本的ICP)
- Mac上查询CPU型号的方法
- BZOJ2612 [Poi2003]Sums
- 新建xCode工程,去掉storyboard配置
- L1-039. 古风排版——二维字符数组的条件输出
- java 多线程全部结束判断方法
- 单车健身注意事项
- ZooKeeper 原理及其在 Hadoop 和 HBase 中的应用
- redis使用场景
- ionic开发——ngCordova全功能测试
- JVM