牛客網國慶集訓派對Day3 D-Shopping(貪心水題)
阿新 • • 發佈:2018-12-13
思路來源
題解
n個物品是都要買的,
所以把最貴的m個物品分別放在不同的購物車裡,
記凳子數為q,把m中最貴的前q個物品打折了就好了,
也就是把凳子放在這些購物車裡面。
因此,最後打折的數量是min(q,m)。
心得
人家的簽到題也不會沒關係,及時補就好了
這世上原本有兩種題,不會和會的,
現在有兩種,能補的和不能補的,
多看看人家程式碼,該會的還是能會的
程式碼
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <cmath> #include <set> #include <map> #include <vector> #include <stack> #include <queue> #include <functional> const double INF=0x3f3f3f3f; const int maxn=1e5+10; const int mod=1e9+7; const int MOD=998244353; const double eps=1e-7; typedef long long ll; #define vi vector<int> #define si set<int> #define pii pair<double,int> #define pi acos(-1.0) #define pb push_back #define mp make_pair #define lowbit(x) (x&(-x)) #define sci(x) scanf("%d",&(x)) #define scll(x) scanf("%lld",&(x)) #define sclf(x) scanf("%lf",&(x)) #define pri(x) printf("%d",(x)) #define rep(i,j,k) for(int i=j;i<=k;++i) #define per(i,j,k) for(int i=j;i>=k;--i) #define mem(a,b) memset(a,b,sizeof(a)) using namespace std; int a[1005],b[1005]; int main() { int t; sci(t); while(t--) { double ans=0; int n,m,cnt=0; sci(n),sci(m); rep(i,0,n-1) { sci(a[i]),sci(b[i]); if(b[i]==1)cnt++; } cnt=min(cnt,m); sort(a,a+n); int num=0; per(i,n-1,0) { num++; if(num<=cnt)ans+=a[i]*0.5; else ans+=a[i]; } printf("%.1lf\n",ans); } return 0; }