2017 ACM-ICPC ECL-FINAL 部分代码

来源:互联网 发布:java rmi 无继承 框架 编辑:程序博客网 时间:2024/06/05 06:27

这里写图片描述
以下代码均为现场代码,注释不存在的
A

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int mod=1e9+7;ll power(ll n,ll p){    ll ans=1;    ll base=n;    while(p){        if(p&1){            ans=ans*base%mod;        }        base=base*base%mod;        p>>=1;    }    return ans;}ll inv(ll n){    return power(n,mod-2);}int main(){    int T;    scanf("%d",&T);    for(int tt=1;tt<=T;tt++){        ll n,k;        scanf("%lld%lld",&n,&k);        //cout<<power(2,6)<<endl;        ll sum=(power(2,n)-1+mod)%mod;        ll up=1,down=1;        //cout<<sum<<endl;        for(ll i=1;i<k&&i<=n;i++){            up=up*(n-i+1)%mod;            down=down*i%mod;            //cout<<up<<' '<<down<<endl;            sum=(sum-up*inv(down))%mod;            sum=(sum+mod)%mod;        }        printf("Case #%d: %lld\n",tt,sum);    }   }

B

#include<bits/stdc++.h>using namespace std;const int maxn = 200005;double X;struct P{    int sz,cnt;    double cc;    bool operator<(const P &p)const{        return cc < p.cc;      }};int A[maxn];double cal(double a,double b){    return b * ((a / b - X ) * (a / b - X )) - (b + 1)*(a/(b+1) - X) * (a/(b+1) - X);    //return tmp * tmp;}priority_queue<P> que;int main(){    //sint tmp = (1LL<<31)-1;    //cout<<tmp<<endl;    int T;    scanf("%d",&T);    int cs = 0;     while(T--){        int n,m;        scanf("%d%d",&n,&m);        while(!que.empty()) que.pop();        int sum = 0;        for(int i = 1;i<=n;i++){            scanf("%d",&A[i]);            sum += A[i];        }        X = sum * 1.0 / m;        for(int i = 1;i<=n;i++){            que.push((P){A[i],1,cal(A[i],1)});        }        for(int i = n+1;i<=m;i++){            P p = que.top();que.pop();            p.cnt++;            p.cc = cal(p.sz,p.cnt);            que.push(p);        }        double ans = 0;        while(!que.empty()){            P p = que.top();que.pop();            ans += 1.0 * p.cnt * (1.0 * p.sz/p.cnt - X) * (1.0 * p.sz/p.cnt - X);        }        printf("Case #%d: %.10lf\n",++cs,ans/m);    }}

C

#include <bits/stdc++.h>using namespace std;int main(){    int T;    scanf("%d",&T);    for(int tt=1;tt<=T;tt++){        int n;        scanf("%d",&n);        double sum=0,tmp=0;        for(int i=1;i<=n+1;i++){            scanf("%lf",&tmp);            sum+=tmp;        }        double M=0;        for(int i=1;i<=n;i++){            double a,b;            scanf("%lf%lf",&a,&b);            M=max(M,b);        }        sum+=M;        printf("Case #%d: %.10f\n",tt,sum);    }}

D

#include <bits/stdc++.h>using namespace std;typedef long long ll;ll ans[2000005];int tot=0;// p fz, q fmll tt[105];ll le[105];inline ll getlen(ll x){    ll ret = 1;    while(x){        ret*=10;        x/=10;    }    return ret;}ll get(ll a,ll p,ll q,int len){    ll tmp=a;    ll x = a;    tt[0] = a;    le[0] = getlen(tt[0]);    for(ll i=1;i<len;i++){        if(tmp%q)return 1e15+1;        tmp /= q;        x /= q;        if(x > 1e15 / p) return 1e15+1;        x *= p;        tt[i] = x;        le[i] = getlen(tt[i]);    }    ll ret = 0;    for(int i = 0;i<len;i++){        //cout<<tt[i]<<' '<<le[i]<<endl;        if(ret > 1e15 / le[i]) return 1e15+1;               ret *= le[i];        ret += tt[i];    }    return ret;}bool flag = 0 ;void solve(ll a,ll q){    for(ll p=q+1;;p++){        if(get(a,p,q,3)>1e15)break;        for(int j=3;;j++){            ll tmp=get(a,p,q,j);            if(tmp>1e15)break;            /*if(tmp < 0){                //cout<<a<<' '<<p<<' '<<q<<' '<<j<<endl;                //flag = 1;                //return;            }*/            ans[++tot]=tmp;        }    }}ll Ans[2000005];int main(){    for(ll i=1;i<100000;i++){        for(ll j=1;j*j<=i;j++){            if(i%(j*j)==0){                solve(i,j);                //if(flag) return 0;            }        }    }    //cout<<get(1,1,2,4)<<endl;    //cout<<tot<<endl;    sort(ans+1,ans+tot+1);    //tot = unique(ans+1,ans+tot+1)-ans;    int tot1 = 0;    for(int i = 1;i<=tot;i++)           if(ans[i]!=ans[i-1])            Ans[++tot1] = ans[i];    //cout<<tot<<endl;    //cout<<tot1<<endl;    //for(int i = tot1;i>tot1-10;i--)    //  cout<<Ans[i]<<endl;    //cout<<get(1024,1,2,5);    //for(int i = 0;i<10;i++)    //  cout<<tt[i]<<endl;    int T;    scanf("%d",&T);    int cs = 0;    while(T--){        ll l,r;        scanf("%lld%lld",&l,&r);        int rr = upper_bound(Ans+1,Ans+tot1+1,r) - Ans - 1;        int ll = upper_bound(Ans+1,Ans+tot1+1,l-1) - Ans - 1;        printf("Case #%d: %d\n",++cs,rr-ll);    }}

H

#include <bits/stdc++.h>using namespace std;char s[1000003];char s1[1000003];int dp[1000003][2];int main(){    int T;    scanf("%d",&T);    for(int tt=1;tt<=T;tt++){        scanf("%s",s+1);        int a,b;        scanf("%d%d",&a,&b);        memset(dp,-1,sizeof(dp));        int n=strlen(s+1);        for(int i=1;i<=n;i++){            if(s[i]=='a'||s[i]=='e'||s[i]=='o'||s[i]=='i'||s[i]=='u')s[i]='0';            else if(s[i]!='?')s[i]='1';        }        dp[0][0]=dp[0][1]=0;        for(int i=1;i<=n;i++){            if(s[i]=='?'){                if(dp[i-1][1]!=-1){                    dp[i][0]=1;                }                else if(dp[i-1][0]!=-1){                    dp[i][0]=dp[i-1][0]+1;                }                if(dp[i][0]>=a)dp[i][0]=-1;                if(dp[i-1][0]!=-1){                    dp[i][1]=1;                }                else if(dp[i-1][1]!=-1){                    dp[i][1]=dp[i-1][1]+1;                }                if(dp[i][1]>=b)dp[i][1]=-1;            }            else if(s[i]=='0'){                if(dp[i-1][1]!=-1){                    dp[i][0]=1;                }                else if(dp[i-1][0]!=-1){                    dp[i][0]=dp[i-1][0]+1;                }                if(dp[i][0]>=a)dp[i][0]=-1;            }            else {                if(dp[i-1][0]!=-1){                    dp[i][1]=1;                }                else if(dp[i-1][1]!=-1){                    dp[i][1]=dp[i-1][1]+1;                }                if(dp[i][1]>=b)dp[i][1]=-1;            }        }        bool tag1=false;        if(dp[n][0]!=-1||dp[n][1]!=-1)tag1=true;        bool tag2=false;        int tmp=0;        //cout<<s+1<<endl;        for(int i=1;i<=n;i++){            if(s[i]=='?')s1[i]='0';            else s1[i]=s[i];            if(s1[i]=='0')tmp++;            else {                tmp=0;            }            if(tmp>=a)tag2=true;        }        tmp=0;        for(int i=1;i<=n;i++){            if(s[i]=='?')s1[i]='1';            else s1[i]=s[i];            if(s1[i]=='1')tmp++;            else {                tmp=0;            }            if(tmp>=b)tag2=true;        }        //cout<<tag1<<' '<<tag2<<endl;        if(tag1&&tag2)printf("Case #%d: SURPRISE\n",tt);        else if(tag1){            printf("Case #%d: LIKE\n",tt);        }        else if(tag2){            printf("Case #%d: DISLIKE\n",tt);        }    }}

J

#include <bits/stdc++.h>using namespace std;typedef long long ll;deque<ll>dq;ll a[200003];int main(){    int T;    scanf("%d",&T);    for(int tt=1;tt<=T;tt++){        int n;        scanf("%d",&n);        while(!dq.empty())dq.pop_back();        bool flag=true;        ll k=0;        for(int i=1;i<=n;i++){            scanf("%lld",&a[i]);        }        a[++n]=0;        for(int i=1;i<=n;i++){            if(dq.empty()){                dq.push_back(a[i]);                continue;            }            while(k+a[i]<dq.back()){                if(dq.size()<=2){                    flag=false;                    break;                }                if(dq.front()+a[i]<dq.back()){                    k=dq.front();                }                else {                    k=dq.back()-a[i];                }                while(!dq.empty()&&dq.front()==k)dq.pop_front();            }            if(!flag)break;            dq.push_back(k+a[i]);            if(a[i]==0){                while(!dq.empty())dq.pop_back();                k=0;            }            //cout<<k<<endl;        }        if(!flag)printf("Case #%d: No\n",tt);        else printf("Case #%d: Yes\n",tt);    }}

K

#include <bits/stdc++.h>using namespace std;typedef long long ll;ll l[105000];ll pre[105000];int main(){    int T;    scanf("%d",&T);    for(int tt=1;tt<=T;tt++){        ll A,b,n,a;        scanf("%lld%lld%lld",&a,&b,&n);        A=a;        for(int i=1;i<=A;i++){            scanf("%lld",&l[i]);            pre[i]=pre[i-1]+l[i];        }        for(int i=1;i<=n;i++){            ll pos=lower_bound(pre+1,pre+1+A,a)-pre;            ll ap=pos;            ll bp=a-pre[pos-1];            //cout<<a<<' '<<b<<endl;            if(ap==a&&bp==b)break;            a=ap,b=bp;        }        printf("Case #%d: %lld-%lld\n",tt,a,b);    }}

L的代码找不到了,结论是大于等于7的奇数先手赢,大于等于16的偶数后手赢,其余平。

M

#include <bits/stdc++.h>using namespace std;typedef long long ll;ll p[5];ll v[5];int main(){    int T;    scanf("%d",&T);    for(int tt=1;tt<=T;tt++){        for(int i=0;i<5;i++)scanf("%lld",&v[i]);        p[0]=48;        p[1]=p[0]+8;        p[2]=p[1]+4;        p[3]=p[2]+2;        p[4]=p[3]+1;        int num;        scanf("%d",&num);        ll ans=0;        for(int i=1;i<=num;i++){            int id;            scanf("%d",&id);            for(int j=0;j<5;j++){                if(id<=p[j]){                    ans+=v[j];                    break;                }            }        }        printf("Case #%d: %lld\n",tt,ans*10000);    }}
原创粉丝点击