1. 程式人生 > >【EOJ Monthly 2018.2 (Good bye 2017)】

【EOJ Monthly 2018.2 (Good bye 2017)】

event for main ems %d urn con temp ood

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

【EOJ Monthly 2018.2 (Good bye 2017)】