链接: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);
}
}