标签:delicious apples hdu 5303 贪心+枚举
2 10 3 2 2 2 8 2 5 1 10 4 1 2 2 8 2 5 1 0 10000
18 26
题意:在一个圆上有n个苹果树,告诉苹果树的位置和每棵树上的苹果个数,还有一个容量为K的篮子,用篮子去摘苹果,起点在位置0,反复去摘直到把所有的苹果都摘回到0,问走的最短距离为多少。
思路:首先将圆一分为二,在圆形两侧能拿满的话肯定就是只走半边再回去,这样比走整圈划算,另外还要想到最后两边都不足K个了,这个时候最多需要走一个整圈,我们不知道这个整圈拿了哪几个苹果,那么就枚举K个。比赛时只是想到了贪心,最后那一部分没有枚举,另外这里的苹果进行了离散化,因为苹果总数只有1e5,大大简化了代码,自己当时写的太冗余=-=
代码:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <string> #include <map> #include <stack> #include <vector> #include <set> #include <queue> #pragma comment (linker,"/STACK:102400000,102400000") #define pi acos(-1.0) #define eps 1e-6 #define lson rt<<1,l,mid #define rson rt<<1|1,mid+1,r #define FRE(i,a,b) for(i = a; i <= b; i++) #define FREE(i,a,b) for(i = a; i >= b; i--) #define FRL(i,a,b) for(i = a; i < b; i++) #define FRLL(i,a,b) for(i = a; i > b; i--) #define mem(t, v) memset ((t) , v, sizeof(t)) #define sf(n) scanf("%d", &n) #define sff(a,b) scanf("%d %d", &a, &b) #define sfff(a,b,c) scanf("%d %d %d", &a, &b, &c) #define pf printf #define DBG pf("Hi\n") typedef long long ll; using namespace std; #define INF 0x3f3f3f3f #define mod 1000000009 const int maxn = 1e5+10; const int MAXN = 2005; const int N = 1005; ll Len,n,k,cnt; ll pos[maxn],dp_l[maxn],dp_r[maxn]; //dp[i]表示拿完前i个苹果要走的的距离和 vector<ll>posl,posr; int main() { #ifndef ONLINE_JUDGE freopen("C:/Users/lyf/Desktop/IN.txt","r",stdin); #endif ll i,j,t; scanf("%lld",&t); ll x,num; while (t--) { cnt=1; scanf("%lld%lld%lld",&Len,&n,&k); posl.clear(); posr.clear(); for (i=0;i<n;i++) { scanf("%lld%lld",&x,&num); for (j=0;j<num;j++) pos[cnt++]=x; } cnt--; k=min(k,cnt); for (i=1;i<=cnt;i++) { if (2*pos[i]<Len) posr.push_back(pos[i]); else posl.push_back(Len-pos[i]); } sort(posl.begin(),posl.end()); sort(posr.begin(),posr.end()); dp_l[0]=dp_r[0]=0; for (i=0;i<(ll)posl.size();i++) { if (i+1<=k) dp_l[i+1]=posl[i]; else dp_l[i+1]=dp_l[i+1-k]+posl[i]; } for (i=0;i<(ll)posr.size();i++) { if (i+1<=k) dp_r[i+1]=posr[i]; else dp_r[i+1]=dp_r[i+1-k]+posr[i]; } ll ans=(dp_l[posl.size()]+dp_r[posr.size()])*2; for (i=0;i<=posr.size()&&i<=k;i++) { ll right=posr.size()-i; ll left=max((ll)0,(ll)(posl.size()-(k-i))); ans=min(ans,(ll)Len+(dp_l[left]+dp_r[right])*2); } printf("%lld\n",ans); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
Delicious Apples (hdu 5303 贪心+枚举)
标签:delicious apples hdu 5303 贪心+枚举
原文地址:http://blog.csdn.net/u014422052/article/details/47037273