1. 程式人生 > >CCPC-WannaFly-Camp #4 G

CCPC-WannaFly-Camp #4 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);     } }