牛客算法競賽入門課第三節習題 小咪買東西(01分數規劃+二分)

題目鏈接:https://ac.nowcoder.com/acm/problem/14662

題目描述
小咪是一個土豪手辦狂魔,這次他去了一家店,發現了好多好多(n個)手辦,但他是一個很怪的人,每次只想買k個手辦,而且他要讓他花的每一分錢都物超所值,即:買下來的東西的總價值/總花費=max。請你來看看,他會買哪些東西吧。

輸入描述:
多組數據。
第一行一個整數T,爲數據組數。
接下來有T組數據。
對於每組數據,第一行兩個正整數n,k,如題。
接下來n行,每行有兩個正整數ci,vi。分別爲手辦的花費和它對於小咪的價值。

輸出描述:
對於每組數據,輸出一個數,即能得到的總價值/總花費的最大值。精確至整數。

輸入

1
5 1
1 2
2 3
3 4
4 5
5 6

輸出

2

備註:
1T101≤T≤10
1n1041≤n≤10^4
1kn1≤k≤n
1ci,vi1041≤ci,vi≤10^4

分析:
01規劃模型題:
在這裏插入圖片描述
設最大值爲ans,對於上述式子,二分x,aixbi>0a_i-xb_i>0的都滿足題意。

代碼:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e4+10;
double  c[N],v[N],sum[N];
int t,n,k;
bool cmp(int x,int y)
{
    return x>y;
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&k);
        for(int i=0; i<n; i++)
            scanf("%lf%lf",&c[i],&v[i]);
        double l=0,r=1000000,mid;
        for(int i=1; i<100; i++)///二分100,就會變的非常小
        {
            mid=(l+r)/2;
            for(int j=0; j<n; j++)
                sum[j]=v[j]-mid*c[j];
            sort(sum,sum+n,cmp);
            double res=0;
            for(int i=0; i<k; i++)
                res+=sum[i];
            if(res>=0.0)
                l=mid;
            else
                r=mid;
        }
        int index=(int)mid;
        printf("%d\n",index);

    }
    return 0;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章