Shovels Shop
生活随笔
收集整理的這篇文章主要介紹了
Shovels Shop
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
https://codeforces.com/contest/1154/problem/F
題意:你現(xiàn)在要買k把鏟子,商店有n把鏟子,價(jià)格數(shù)組給出。現(xiàn)在有m個(gè)優(yōu)惠:如果買了x_i個(gè)鏟子,那么其中y_i個(gè)最便宜的鏟子免費(fèi)。一次只能使用一個(gè)優(yōu)惠或者不使用。求最少花費(fèi)。
C++版本一
題解:完全背包+DP+思維
1、相比傳統(tǒng)完全背包,這個(gè)問題要先讓前i個(gè)物品最優(yōu);
2、x最為體積,區(qū)間[i-x+1,i-x+y]的和作為價(jià)值;
3、此題解尋找最大折扣;
/* *@Author: STZG *@Language: C++ */ #include <bits/stdc++.h> #include<iostream> #include<algorithm> #include<cstdlib> #include<cstring> #include<cstdio> #include<string> #include<vector> #include<bitset> #include<queue> #include<deque> #include<stack> #include<cmath> #include<list> #include<map> #include<set> //#define DEBUG #define RI register int #define endl "\n" using namespace std; typedef long long ll; //typedef __int128 lll; const int N=200000+10; const int M=2000+10; const int MOD=1e9+7; const double PI = acos(-1.0); const double EXP = 1E-8; const int INF = 0x3f3f3f3f; int t,n,m,k,p,l,r; ll ans,cnt,flag,temp,sum[N]; ll a[N],dp[M],w[N],v[N]; int main() { #ifdef DEBUGfreopen("input.in", "r", stdin);//freopen("output.out", "w", stdout); #endif//ios::sync_with_stdio(false);//cin.tie(0);//cout.tie(0);//scanf("%d",&t);//while(t--){scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;i++){scanf("%I64d",&a[i]);}sort(a+1,a+n+1);for(int i=1;i<=m;i++){//scanf("%d%d",&e[i].x,&e[i].y);scanf("%I64d%I64d",&w[i],&v[i]);}for(int i=1;i<=n;i++){sum[i]=sum[i-1]+a[i];}for(int j=1;j<=k;j++){for(int i=1;i<=m;i++){if(j<w[i])continue;dp[j]=max(dp[j],dp[j-w[i]]+sum[j-w[i]+v[i]]-sum[j-w[i]]);}}cout<<sum[k]-dp[k]<<endl;//}#ifdef DEBUGprintf("Time cost : %lf s\n",(double)clock()/CLOCKS_PER_SEC); #endif//cout << "Hello world!" << endl;return 0; }?C++版本二
題解:
1、對(duì)折扣規(guī)則排序,降低復(fù)雜度;
2、前綴和;
#include<bits/stdc++.h> #define ll long long #define pb push_back #define INF 0x3f3f3f3f; #define fi first #define se second #define MP make_pair #define PI pair<int,int> #define lson l,m,rt<<1,ls,rs #define rson m+1,r,rt<<1|1,ls,rs #define test printf("here!!!\n") using namespace std; const int mx=2e5+10; int n,m,k; ll a[mx]; ll qz[mx]; ll dp[mx]; struct Node {int x;int y; }b[mx]; bool cmp(const Node &a,const Node &b) {if (a.x!=b.x) return a.x<b.x;return a.y<b.y; } int main() {memset(dp,0x3f,sizeof(dp));dp[0]=0;scanf("%d%d%d",&n,&m,&k);for (int i=1;i<=n;++i){scanf("%I64d",&a[i]);}for (int i=1;i<=m;++i){scanf("%d%d",&b[i].x,&b[i].y);}sort(a+1,a+n+1);for (int i=1;i<=n;++i){qz[i]=qz[i-1]+a[i];}sort(b+1,b+n+1,cmp);for (int i=1;i<=k;++i){dp[i]=min(dp[i],dp[i-1]+a[i]);for (int j=1;b[j].x<=i;++j){dp[i]=min(dp[i],dp[i-b[j].x]+qz[i]-qz[i-b[j].x+b[j].y]);}}printf("%lld\n",dp[k]); }?
總結(jié)
以上是生活随笔為你收集整理的Shovels Shop的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Two Teams
- 下一篇: Minimum Possible LCM