1. 程式人生 > >ccf-集合競價-201412-3

ccf-集合競價-201412-3

min int sin 枚舉 eps str ons 數據 else

這道題數據量很小,所以用前綴和直接暴力解決了

首先將浮點數轉換為整數;

int_p=(int)(dou_p*100+0.5); 必須加一個eps,否則浮點數運算會有誤差

然後從高到低枚舉

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 const int N=1e6+7;
 5 const int M=5007;
 6 struct node {
 7     bool by;
 8     int p; LL num;
 9 };
10 node t[M]; 
11 bool flag[M]; 12 LL sum1[N], sum2[N]; 13 int main () 14 { 15 string str; int i=0,p_max=0,p_min=0x3f3f3f3f; 16 while (cin>>str) { 17 i++; 18 if (str[0]==c) { int x; cin>>x; flag[x]=1; } 19 else { 20 double p; 21 cin>>p>>t[i].num;
22 if (str[0]==b) t[i].by=1; 23 t[i].p=(int)(p*100+0.5); 24 p_max=max (p_max,t[i].p); 25 p_min=min (p_min,t[i].p); 26 } 27 } 28 int n=i; 29 for (i=1;i<=n;i++) 30 if (!flag[i]) { 31 if (t[i].by) sum1[t[i].p]+=t[i].num;
32 else sum2[t[i].p]+=t[i].num; 33 } 34 for (int i=1;i<N;i++) { 35 sum1[i]+=sum1[i-1]; 36 sum2[i]+=sum2[i-1]; 37 } 38 LL sum=0; int ans; 39 for (int i=p_max;i>=p_min;i--) { 40 LL x=min (sum1[N-1]-sum1[i-1],sum2[i]); 41 if (x>sum) { sum=x; ans=i; } 42 } 43 int a1=ans/100,a2=ans%100; 44 printf("%d.%02d %lld\n",a1,a2,sum); 45 return 0; 46 }

ccf-集合競價-201412-3