Live2d Test Env

【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\n");
        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\n");
    else
        printf("Second\n");
    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\n");
        else printf("%.6lf\n",a);
    } return 0;
}
View Code

 

posted @ 2018-02-14 00:14  nimphy  阅读(267)  评论(0编辑  收藏  举报