• 【EOJ Monthly 2018.2 (Good bye 2017)】


    23333333333333333

    由于情人节要回家,所以就先只放代码了。 

    此题是与我胖虎过不去。

    【E. 出老千的 xjj】

    #include<cstdio>
    #include<cstdlib>
    #include<cstring>
    #include<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=3000000;
    #define ll long long
    int i,j,n,k,x;
    ll p[maxn+10],sum[maxn+10],tmp,ans=100000000000000000,Max=0; 
    int main()
    {
        scanf("%d%d",&n,&k);
        for(i=1;i<=n;i++){
            scanf("%d",&x);
            tmp+=x;
            p[x]++;
        }
        if(tmp<=k){
            printf("0
    ");
            return 0;
        }
        for(i=1;i<=maxn;i++) {
           sum[i]=sum[i-1]+p[i]*i;
           p[i]+=p[i-1];
        }
        for(i=2;i<=maxn;i++){
            ll yy=(k-1)/i+1;
            ll xx=n;
            tmp=0;
            //if(k%i==0&&yy<xx) continue;  
            if(k%i==0) continue; //上面的WA了 
            for(j=0;j<maxn/i;j++){
                int n1=(j+1)*i,n2=j*i+1;
                if(n2<0) n2=0;
                xx+=(p[n1]-p[n2-1]);
                tmp+=(p[n1]-p[n2-1])*((j+1)*i)-sum[n1]+sum[n2-1];
                if(k%i==0&&yy<xx) break;
                if(tmp>ans) break;
            }
            if((k%i==0&&xx<=yy)||k%i!=0){
              ans=min(ans,tmp);
            }
        }
        cout<<ans<<endl;;
        return 0;
    }

    【A2】

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<ctime>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<string>
    using namespace std;
    int n,k,p;
    int num[6]={100,50,20,10,5,1},cost[15];
    long long f[110];
    int main(){
        scanf("%d%d%d",&n,&k,&p);
        for(int i=1;i<=k;i++){
            long long temp=1LL*i*p;
            for(int j=0;j<=5;j++)
                if(temp>=num[j]){
                    cost[i]+=temp/num[j];
                    temp%=num[j];
                }
        }
        memset(f,10,sizeof(f));
        f[0]=0;
        for(int i=1;i<=100;i++)
            for(int j=max(0,i-k);j<i;j++)
                f[i]=min(f[i],f[j]+cost[i-j]);
        if(n<=100){
            cout<<f[n]<<endl;
            return 0;
        }
        int way=1;
        for(int i=2;i<=k;i++)
            if(1.0*i/cost[i]>1.0*way/cost[way])
                way=i;
        int t1=n/way,t2=n%way;
        long long ans=1LL*t1*cost[way]+f[t2];
        for(int i=1;i<=100;i++){
            t1=n/way-i;
            t2=n-way*t1;
            ans=min(ans,1LL*t1*cost[way]+f[t2]);
        }
        cout<<ans<<endl;
        return 0;
    }
    View Code

    【B】

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<ctime>
    #include<cstdlib>
    #include<algorithm>
    #include<cmath>
    #include<string>
    using namespace std;
    int N,sta[25];
    int f[1100000];
    struct edge{
        int x,y;
    }e[25];
    int have[25][25],cnt[25];
    int check(int x,int s){
        bool flag=0;
        for(int i=1;i<=cnt[x];i++)
            if(s&sta[have[x][i]]){
                flag=1;
                break;
            }
        if(!flag)
            return -1;
        for(int i=1;i<=cnt[x];i++)
            if(s&sta[have[x][i]])
                s^=sta[have[x][i]];
        return s;
    }
    int dfs(int s){
        if(f[s]!=-1)
            return f[s];
        for(int i=1;i<=N;i++){
            int temp=check(i,s);
                if(temp!=-1)
                    if(!dfs(temp))
                        return f[s]=1;
        }
        return f[s]=0;
    }
    int main(){
        sta[0]=1;
        for(int i=1;i<=20;i++)
            sta[i]=sta[i-1]*2;
        scanf("%d",&N);
        for(int i=0;i<N-1;i++){
            scanf("%d%d",&e[i].x,&e[i].y);
            have[e[i].x][++cnt[e[i].x]]=i;
            have[e[i].y][++cnt[e[i].y]]=i;
        }
        memset(f,-1,sizeof(f));
        f[0]=0;
        if(dfs(sta[N-1]-1))
            printf("First
    ");
        else
            printf("Second
    ");
        return 0;
    }
    View Code

    【F】

    #include<cstdio>
    #include<cstdlib>
    #include<iostream>
    using namespace std;
    const int maxn=10010;
    int main()
    {
        int T;
        double a,b,c,x,y,z;
        while(~scanf("%lf%lf%lf",&x,&y,&z)){
            a=(2.0*y-z+x)/2.0;
            b=x-a;
            c=(z-a-b)/2.0;
            if(a<=0||b<=0||c<=0) printf("Wrong
    ");
            else printf("%.6lf
    ",a);
        } return 0;
    }
    View Code
  • 相关阅读:
    REOBJECT structure
    IStorage
    如何使用电骡eMule上传资源
    WinKawaks使用技巧
    百科知识 DMG文件如何打开
    C#.NET的TabControl如何隐藏和显示页面
    生活娱乐 什么是安哥拉恐怖之颚
    生活娱乐 橄榄油的功能
    生活娱乐 冯增最牛的房车
    生活娱乐 杜甫很忙图片全集
  • 原文地址:https://www.cnblogs.com/hua-dong/p/8447768.html
Copyright © 2020-2023  润新知