Codeforces Round #311

来源:互联网 发布:怎么查看电脑ip端口 编辑:程序博客网 时间:2024/06/05 14:30

昨天晚上的Codeforces 写的有点逗,无状态呀~

A题:

题意:满足三个条件的等级数量分配,尽量让一级的最多,二等其次,输出答案 。

暴力

const int maxn=1000+5;using namespace std;int main(){    int n;    while(cin>>n)    {        int a,b,c;        int aa,bb,cc;        cin>>a>>aa>>b>>bb>>c>>cc;        for(int i=aa;i>=a;i--)        {            int yu=n-i;            if(yu<(b+c))continue;            for(int j=bb;j>=b;j--)            {                int d=yu-j;                if(d>=c&&d<=cc)                {                    cout<<i<<" "<<j<<" "<<d<<endl;                    return 0;                }            }        }        }    return 0;}

B题:

题意:给n个男生和给n个女生倒水,给你2*N个杯子的容量,倒水的总量不超过W,求最多倒水。

解法:二分判断
判断是否总量小于w,并且杯子容量够用,当然排序后,只需要判断w[0]是否满足女生,w[n]是否满足男生就可以了。
我的写法要控制二分的次数,否则会T掉

const int maxn=200000+5;using namespace std;const double eps=1e-12;double a[maxn];int n;double w;int getbool(double x){    if(3*n*x>w)return false;    if(a[0]<x)return false;    if(a[n]<2*x)return false;    return true;}int main(){    while(cin>>n>>w)    {        for(int i=0;i<2*n;i++)        {            scanf("%lf",&a[i]);        }        sort(a,a+2*n);        double  ans=0;        int num=0;        double l=0;double r=w*3.0;        while(r-l>=eps)        {            num++;if(num>10000000)break;            double mid=(r+l)/2.0;            if(getbool(mid))            {                l=mid;                ans=mid;            }            else r=mid;        }        ans=ans*3.0*(double)n;        printf("%.8lf\n",ans);    }    return 0;}

C题:

题意:砍掉一些桌子腿,是桌子稳固,稳固的条件,1:最长的腿数量最多 2:最长的腿数量占一半以上

解法:贪心
答案肯定是某种长度的腿全部留下,个数为len个,还可以保留len-1个长度比选择的腿短的,贪心选择花费最大的就好了。题中给出的花费<=200,所以暴力200进行选择就好了。

#define ll long longconst int maxn=100000+5;using namespace std;int n;struct node{    int l,d;}a[maxn];int b;bool cmp(node a,node b){    return a.l<b.l;}int main(){    while(cin>>n)    {        b=0;        for(int i=0;i<n;i++)        {            scanf("%d",&a[i].l);        }        for(int i=0;i<n;i++)        {            scanf("%d",&a[i].d);            b+=a[i].d;        }        sort(a,a+n,cmp);        int ans=0x5fffffff;        int num[250];        memset(num,0,sizeof(num));        for(int i=0;i<n;i++)        {            int len=0;            int sum=0;            for(;i<n;i++)            {                sum+=a[i].d;len++;                if((i+1)<n){                    if(a[i].l!=a[i+1].l)break;                }                else break;            }            int t=len-1;            for(int j=200;j>=1;j--)            {                if(t<=num[j]){                  sum+=(t*j);                  break;                }                else{                    t-=num[j];                    sum+=(num[j]*j);                }            }                for(int j=0;j<len;j++)            {                num[a[i-j].d]++;            }            ans=min(ans,b-sum);        }        cout<<ans<<endl;    }    return 0;}
0 0
原创粉丝点击