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); } }