一天,GJJ去购物,来到商场门口,GJJ计划要买n个商品,第i个商品的坐标为(xi,yi),重量是wi。
GJJ比较任性,想按照商品编号从小到大的顺序将所有的商品的搬到车里(车在(0,0)的位置);
GJJ可以几个商品一起搬,但在任何时候GJJ手中的商品重量不能超过最大载重C。
商场的过道只有横着的和竖着的。求GJJ行走的最短距离(GJJ的起始位置为(0,0))。
标签:memory using gre c++ 最大 回车 led str 接下来
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 #define inf 0x3f3f3f3f 5 int d1[100005],d2[100005],f[100005]; 6 int x[100005],y[100005],w[100005]; 7 struct node 8 { 9 int u,w; 10 bool operator<(const node &tmp)const{ 11 return w>tmp.w; 12 } 13 }; 14 priority_queue<node>Q; 15 int main() 16 { 17 // freopen("in.txt","r",stdin); 18 int T,C,N,i,j,k; 19 cin>>T; 20 while(T--){ 21 while(!Q.empty()) Q.pop(); 22 cin>>C>>N; 23 for(i=1;i<=N;++i) 24 { 25 scanf("%d%d%d",&x[i],&y[i],&w[i]); 26 w[i]+=w[i-1]; 27 d1[i]=d1[i-1]+abs(x[i]-x[i-1])+abs(y[i]-y[i-1]); 28 d2[i]=x[i]+y[i]; 29 } 30 f[1]=d2[1]*2; 31 Q.push(node{0,0}); 32 Q.push(node{1,f[1]+d2[2]-d1[2]}); 33 for(i=2;i<=N;++i) 34 { 35 node tmp=Q.top(); 36 while(!Q.empty()&&w[i]-w[tmp.u]>C){ 37 Q.pop(); 38 tmp=Q.top(); 39 } 40 f[i]=tmp.w+d2[i]+d1[i]; 41 Q.push(node{i,f[i]-d1[i+1]+d2[i+1]}); 42 } 43 cout<<f[N]<<endl; 44 } 45 return 0; 46 } 47 //注释freopen语句!!!
标签:memory using gre c++ 最大 回车 led str 接下来
原文地址:http://www.cnblogs.com/zzqc/p/7395600.html