標籤:sort turn stream map int class 題意 code tor
題意:
在一個長度為L的環上有N棵蘋果樹。你的籃子容量是K個蘋果。
每棵蘋果樹上都有a[i]個蘋果。
問你從0點出發最少要走多少距離能拿完所有的蘋果。
思路:
我們考慮dp,dp[0][i]代表順時針取i個蘋果的最短距離。
dp[1][i]代表逆時針取i個蘋果的最短距離。
那麼設蘋果的總是為sum
那麼ans=dp[0][i]+dp[sum-i] (0<=i<=sum)
代碼:
#include"stdio.h"#include"algorithm"#include"string.h"#include"iostream"#include"queue"#include"map"#include"vector"#include"string"#include"cmath"using namespace std;#define ll __int64ll l;struct node{ int x,s;} ap[123456];ll dp[2][123456];int cmp(node a,node b){ return a.x<b.x;}int main(){ int t; cin>>t; while(t--) { int n,k; scanf("%I64d%d%d",&l,&n,&k); for(int i=0; i<n; i++) scanf("%d%d",&ap[i].x,&ap[i].s); memset(dp,0,sizeof(dp)); sort(ap,ap+n,cmp); int tep=1,sum=0; //tep代表取了幾個蘋果 由於一定是遞增的 for(int i=0; i<n; i++) { for(int j=0; j<ap[i].s; j++) { if(tep-k<0) dp[0][tep]=dp[0][0]+min(l,2LL*ap[i].x); else dp[0][tep]=dp[0][tep-k]+min(l,2LL*ap[i].x); tep++; } } tep=1; for(int i=n-1; i>=0; i--) { sum+=ap[i].s; for(int j=0; j<ap[i].s; j++) { if(tep-k<0) dp[1][tep]=dp[1][0]+min(l,2LL*(l-ap[i].x)); else dp[1][tep]=dp[1][tep-k]+min(l,2LL*(l-ap[i].x)); tep++; } } ll ans=999999999999999999LL; for(int i=0;i<=sum;i++) ans=min(ans,dp[0][i]+dp[1][sum-i]); printf("%I64d\n",ans); } return 0;}
[多校2015.02.1004 dp] hdu 5303 Delicious Apples