1014: 奇怪的餐厅

题目描述
鲁大师和他的朋友经常去一家奇怪的餐厅,为什么说奇怪呢,一是餐厅提供的菜品比较奇怪,二是餐厅的付费规则比较奇怪,
每个人有不同的折扣上限(单人从总结里折算的最高金额),超过折扣上限的部分原价付费(N个人可以每人出一部分),
这次鲁大师和魏然层风以及朋友一共N个人去这家餐厅吃饭,他们点的菜品总金额为T,现在告诉你每个人的折扣率z和折扣
上限H,请告诉他们最少需要支付多少钱?
输入
输入数据有多组,每组占N+1行,第一行是N和T,接下来N行,每行两个数字z和H(0<N<100)。
输出
对于每组输入数据,输出一行,对应一个要求的答案。答案向下取整。
样例输入
2 100
0.7 70
0.6 50
3 500
0.6 100
0.8 200
0.7 100
1 100
0.6 100
样例输出
65
390
60

【思路】将折扣率自低向高排序.

#include<stdio.h>
struct mon{
	double Z;
	int H; 
};
struct mon arr[100]; 
int main(void){
    int N,T;
    while(scanf("%d%d",&N,&T)!=EOF){
        for(int i=0;i<N;i++){
            scanf("%lf%d",&arr[i].Z,&arr[i].H);
        }
        struct mon temp;
        //对折扣顺序进行排序 
        for(int i=0;i<N;i++){
            for(int j=0;j<N-i-1;j++){
                if(arr[j].Z>arr[j+1].Z){
                    temp=arr[j];
                    arr[j]=arr[j+1];
                    arr[j+1]=temp;
                }
            }
        }
        //计算价格,从折扣高的 开始计算
        int res=0;
        int need=T;
        for(int k=0;k<N;k++){
            if(need>arr[k].H){
                res+=arr[k].H*arr[k].Z;
                need-=arr[k].H;
            }
            else{//已经结算清楚了 
                res+=need*arr[k].Z;
                need=0;
                break;
            }
        }
        //有可能折扣用完了,还没结算清楚
        if(need!=0){
            res+=need;
        } 
        printf("%d\n",res);
    }
    return 0;
}
发布了44 篇原创文章 · 获赞 1 · 访问量 2286

猜你喜欢

转载自blog.csdn.net/Do_________/article/details/103928296