CCPC-WannaFly-Camp #4 G - 贵族用户 卡精度

博客目录

链接:https://www.nowcoder.com/acm/contest/205/G
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

终于活成了自己讨厌的样子。
充钱能让你变得更强。
在暖婊这个游戏里面,如果你充了x元钱,那么你能获得10x个钻石。同时暖婊也有m档VIP,如果你往暖婊里面充了ai个钻石,那么你能成为第i档贵族用户。当你成为第i档贵族用户之后,那么你可以获得的优惠。
你需要k件材料合成衣服,其中第i件材料原价为di个钻石,你一共需要ci件这种材料。当你获得p的优惠时,这个材料的真实价格为
请问栗子米最少需要氪多少钱,这里我们规定只能氪整数的钱。

输入描述:

第一行一个整数T(T≤ 1000),表示数据组数。
每组数据第一行两个整数m,k(1≤ m,k≤ 15)。
接下来m行每行两个正整数1≤ ai≤ 105, 1≤ pi≤ 100,保证aii+1,pi≤ pi+1。
接下来k行每行两个正整数1≤ ci, di≤ 1000。

输出描述:

对于每组数据,输出一个整数,表示至少要氪多少钱。

示例1

输入

复制

1
1 1
100 100
100 100

输出

复制

10

解析

注意考虑达不到vip的情况(在这点上wa了n发),然后就是微小量对向上取整的影响,要么用long double提高精度(大家说这么可以做)我是用的公式法判断了一下。

#include<bits/stdc++.h>
#include<cstring>
using namespace std;
typedef long long ll;
struct node{
    ll v,c;
};
struct CL{
    ll a,p;
};
node co[20];
CL cl[20];
int m,k;
ll check(int p){
    ll ans=0;
    ll t;
    double ori;
    for(int i=0;i<k;i++){
        ll v=co[i].v;
        ori=v*(1-(double)p/100);
        t=ceil(ori);
        if(100*(ll)ori==100*v-v*p){
            t=(ll)ori;
        }
        ans+=co[i].c*t;
    }
    return ans;
}
signed main(){
    #ifndef ONLINE_JUDGE
    freopen("r.txt","r",stdin);
    #endif
    int T;
    cin>>T;
    while(T--){
        scanf("%d%d",&m,&k);
        for(int i=0;i<m;i++){
            scanf("%lld%lld",&cl[i].a,&cl[i].p);
        }
        for(int i=0;i<k;i++){
            scanf("%lld%lld",&co[i].c,&co[i].v);
        }
        ll ans=check(0);
        bool flag=0;
        ll t;
        for(int i=0;i<m;i++){
            t=max(check(cl[i].p),cl[i].a);
            ans=min(t,ans);
        }
        ans=ceil(ans/10.0);
        printf("%d\n",ans);
    }
}

猜你喜欢

转载自blog.csdn.net/GreyBtfly/article/details/82945451
今日推荐