POJ-2976Dropping tests

来源:互联网 发布:最新网络流行歌曲 编辑:程序博客网 时间:2024/06/06 01:10
题意:n场考试,有bi个题,对了ai个题。去掉k场考试,前平均对的最大值。


思路:c(x)平均值为x是否满足。可以转化为 a[i]-x*b[i],排序后求和,最后累加,看是否大于等于0.
      精度感人的题目。




WR(不知道哪里错了)

#include <iostream>#include <map>#include <algorithm>#include <cstdio>#include <cstring>#include <cstdlib>#include <vector>#include <queue>#include <stack>#include <functional>#include <set>#include<sstream>#include <cmath>using namespace std;#define pb push_back#define PB pop_back#define bk back()#define fs first#define se second#define INF 1e9*2+10#define sq(x) (x)*(x)#define eps (1e-7)#define clr(x) memset((x),0,sizeof (x))#define cp(a,b) memcpy((a),(b),sizeof (b))const int maxn=1010;int n,k;double a[maxn],b[maxn];bool C(double m){    double c[maxn];    for(int i=0;i<n;i++) c[i]=a[i]-m*b[i];    sort(c,c+n);    double sum=0;    for(int i=n-1;i>=k;i--)  sum+=c[i];    return sum>0;}int main(){    while(cin>>n>>k&&n&&k)    {        for(int i=0;i<n;i++) cin>>a[i];        for(int i=0;i<n;i++) cin>>b[i];        double left,right,mid;        left=0.0;        right=1.0;        while(right-left>eps)        {            mid=(left+right)/2;            if(C(mid))  left=mid;            else        right=mid;        }        printf("%.0f\n",left*100);    }    return 0;}

别人家的AC代码:

#include <iostream>#include <string>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace std;const int maxn=1002;const double eps=1e-7;int n,k;double a[maxn];double b[maxn];int main(){    while(cin>>n>>k)    {        if(n==0&&k==0)break;      for(int i=0;i<n;i++)       scanf("%lf",&a[i]);      for(int j=0;j<n;j++)       scanf("%lf",&b[j]);      double L=0.0;      double R=1.0;      double mid;      double t[1004];      while(R-L>eps)      {         mid=(R+L)*1.0/2;         for(int i = 0; i < n; i++)          t[i] = a[i] - mid * b[i];         sort(t, t + n);         double sum = 0;         for(int i = k; i < n; i++)          sum += t[i];        if(sum>0)            L=mid;        else            R=mid;      }      printf("%.0f\n",mid*100);    }    return 0;}


0 0