Codeforces Round #304 (Div. 2)——A.B.C.D.E

来源:互联网 发布:mac版 帝国时代2hd 编辑:程序博客网 时间:2024/06/05 18:43

http://codeforces.com/contest/546

A. Soldier and Bananas
去超市买东西,第一个东西k元,第二个东西2*k元。问要借多少钱

#include <bits/stdc++.h>#define LL long long#define foreach(v,i) for(__typeof((v).begin()) i=(v).begin();i!=(v).end();++i)const int MAXN = 110;const int INF = 0x3f3f3f3f;using namespace std;LL k,n,w;int main(){#ifndef ONLINE_JUDGEfreopen("in.cpp","r",stdin);freopen("out.cpp","w",stdout);#endif // ONLINE_JUDGE    scanf("%I64d%I64d%I64d",&k,&n,&w);    LL sum=0;    for(LL i=1;i<=w;++i){        sum+=i*k;    }    if(n>=sum) puts("0");    else cout<<sum-n<<endl;    return 0;}

B. Soldier and Badges
为了使一个序列中的元素互不相同,至少需要多少花费,花费1使得某个值加1

排个序,遍历一下

#include <bits/stdc++.h>#define LL long long#define foreach(v,i) for(__typeof((v).begin()) i=(v).begin();i!=(v).end();++i)const int MAXN = 110;const int INF = 0x3f3f3f3f;const int maxn = 3005;using namespace std;int a[maxn];int main() {#ifndef ONLINE_JUDGE    freopen("in.cpp","r",stdin);    freopen("out.cpp","w",stdout);#endif // ONLINE_JUDGE    int n;    while(~scanf("%d",&n))    {        for(int i=1;i<=n;i++)        {            scanf("%d",&a[i]);        }        sort(a+1,a+n+1);        int ans=0;        for(int i=2;i<=n;i++)        {            if(a[i]<=a[i-1]){                ans+=a[i-1]+1-a[i];                a[i]=a[i-1]+1;            }        }        printf("%d\n",ans);    }    return 0;}

C. Soldier and Cards
两个人玩游戏,每次每个人从自己的牌堆顶抽一张牌,牌大的那个人拿走当前的两张牌,并按从小到大的顺序放到自己的牌堆底。最后牌堆空的人输。问要经过多少轮才能决出胜负,如果永远都无法决定胜负,输出-1

记录两个牌堆的状态,当状态重复了,说明平局。模拟一下

#include <bits/stdc++.h>const int MAXN = 100010;const int INF = 0x3f3f3f3f;const int maxn = 1000005;using namespace std;typedef long long LL;int x[MAXN],h[MAXN];int len[MAXN];int n;int a[4*maxn],b[4*maxn];map <pair<LL,LL> , bool> mm;int main() {#ifndef ONLINE_JUDGEfreopen("in.cpp","r",stdin);freopen("out.cpp","w",stdout);#endif // ONLINE_JUDGE    int n;    while(~scanf("%d",&n))    {        mm.clear();        int n1,n2;        scanf("%d",&n1);        for(int i=1;i<=n1;i++)        {            scanf("%d",&a[i]);        }        scanf("%d",&n2);        for(int i=1;i<=n2;i++)        {            scanf("%d",&b[i]);        }        int l1=1,r1=n1,l2=1,r2=n2;        int flag=0;        int cnt=0;        while(1)        {            int ans1=0,ans2=0;            for(int i=l1;i<=r1;i++)            {                ans1=ans1*10+a[i];            }            for(int i=l2;i<=r2;i++)            {                ans2=ans2*10+b[i];            }            if(mm[make_pair(ans1,ans2)]==1||mm[make_pair(ans2,ans1)]==1) break;            mm[make_pair(ans1,ans2)]=1;mm[make_pair(ans2,ans1)]=1;            if(a[l1]>b[l2])            {                a[++r1]=b[l2];a[++r1]=a[l1];l1++;l2++;            }            else if(a[l1]<b[l2])            {                b[++r2]=a[l1];b[++r2]=b[l2];l2++;l1++;            }            cnt++;            if(l1>r1) {flag=1;break;}            if(l2>r2) {flag=2;break;}        }        if(flag==0) printf("-1\n");        else if(flag==1) printf("%d 2\n",cnt);        else printf("%d 1\n",cnt);    }    return 0;}

D. Soldier and Number Game
初始值n=a!/b!,每次任选一个x>1去除n,n=n/x,当n=1时,游戏结束。问最多可以除多少次

求出每个数的素因子的个数,累加

#include <bits/stdc++.h>#define clr(a,b) memset(a,b,sizeof(a))typedef long long LL;const int MAXN = 5000100;using namespace std;bool isprime[MAXN];int prime[MAXN],cnt;int num[MAXN];LL sum[MAXN];int n;void init(){    clr(isprime,1);    cnt=0;    for(int i=2;i<MAXN;++i){        if(isprime[i]){            prime[cnt++]=i;            for(int j=i+i;j<MAXN;j+=i){                isprime[j]=false;            }        }    }    clr(num,0);    int tmp;    for(int i=2;i<=5000000;++i){        tmp=0;        int x=i;        for(int j=0;j<cnt&&prime[j]*prime[j]<=x;++j){            while(x%prime[j]==0){                tmp++;                x/=prime[j];            }        }        if(x!=1) tmp++;        num[i]=tmp;    }    sum[0]=sum[1]=0;    for(int i=2;i<=5000000;++i){        sum[i]=(LL)(sum[i-1]+num[i]);    }}int main(){#ifndef ONLINE_JUDGE    freopen("in.cpp","r",stdin);    freopen("out.cpp","w",stdout);#endif // ONLINE_JUDGE    init();    int a,b,x;    scanf("%d",&n);    while(n--){        scanf("%d%d",&a,&b);        printf("%I64d\n",sum[a]-sum[b]);    }    return 0;}

E. Soldier and Traveling
给定一个n个顶点的无向图,初始每个顶点的士兵数为ai,每个顶点的士兵只能走向相邻顶点。问能否达到目标状态,并输出方案数

source->i=ai, i->i’=INF,i’->sink=b[i];若u与v有边连接,则u->v’=INF,v->u’=INF。
求最大流

//By kuangbin//只能求一次最大流#include <bits/stdc++.h>const int MAXN=220;const int MAXM=1000;//注意边的数目,因为连边是连两条/经常reconst int INF=0x3f3f3f3f;using namespace std;int a[MAXN],b[MAXN];int G[MAXN][MAXN];//int n,s,t,N;//输入的顶点数,源点,汇点,总顶点数struct Edge {    int to,next,cap,flow;} edge[MAXM<<1];int head[MAXN],tot,gap[MAXN],d[MAXN],cur[MAXN],que[MAXN],p[MAXN];void init(){    tot=0;    memset(head,-1,sizeof(head));}void addedge(int u,int v,int c){    edge[tot].to = v;    edge[tot].cap = c;    edge[tot].flow = 0;    edge[tot].next = head[u];    head[u] = tot++;    edge[tot].to = u;    edge[tot].cap = 0;    edge[tot].flow = 0;    edge[tot].next = head[v];    head[v] = tot++;}void BFS(int source,int sink){    memset(d,-1,sizeof(d));//clr(d,-1);    memset(gap,0,sizeof(gap));//clr(gap,0);    gap[0] = 1;    int front = 0,rear = 0;    d[sink] = 0;    que[rear++] = sink;    while(front != rear) {        int u = que[front++];        for(int i = head[u]; i != -1; i = edge[i].next) {            int v = edge[i].to;            if(d[v] != -1) continue;            que[rear++] = v;            d[v] = d[u]+1;            gap[d[v]]++;        }    }}int isap(int source,int sink,int N){    BFS(source,sink);    memcpy(cur,head,sizeof(head));    int top = 0,x = source,flow = 0;    while(d[source] < N) {        if(x == sink) {            int Min = INF,inser;            for(int i = 0; i < top; ++i) {                if(Min > edge[p[i]].cap - edge[p[i]].flow) {                    Min = edge[p[i]].cap - edge[p[i]].flow;                    inser = i;                }            }            for(int i = 0; i < top; ++i) {                edge[p[i]].flow += Min;                edge[p[i]^1].flow -= Min;            }            flow += Min;            top = inser;            x = edge[p[top]^1].to;            continue;        }        int ok = 0;        for(int i = cur[x]; i != -1; i = edge[i].next) {            int v = edge[i].to;            if(edge[i].cap > edge[i].flow && d[v]+1 == d[x]) {                ok = 1;                cur[x] = i;                p[top++] = i;                x = edge[i].to;                break;            }        }        if(!ok) {            int Min = N;            for(int i = head[x]; i != -1; i = edge[i].next) {                if(edge[i].cap > edge[i].flow && d[edge[i].to] < Min) {                    Min = d[edge[i].to];                    cur[x] = i;                }            }            if(--gap[d[x]] == 0) break;            gap[d[x] = Min+1]++;            if(x != source) x = edge[p[--top]^1].to;        }    }    return flow;}int main(){#ifndef ONLINE_JUDGE    freopen("in.cpp","r",stdin);    freopen("out.cpp","w",stdout);#endif // ONLINE_JUDGE    int n,m,u,v;    scanf("%d%d",&n,&m);    init();    int sum1=0,sum2=0;    int source=0,sink=n<<1|1;    for(int i=1;i<=n;++i){        scanf("%d",&a[i]);        sum1+=a[i];        addedge(source,i,a[i]);        addedge(i,i+n,INF);    }    for(int i=1;i<=n;++i){        scanf("%d",&b[i]);        sum2+=b[i];        addedge(i+n,sink,b[i]);    }    for(int i=0;i<m;++i){        scanf("%d%d",&u,&v);        addedge(u,v+n,INF);        addedge(v,u+n,INF);    }    if(sum1!=sum2){        puts("NO");        return 0;    }    if(sum1==isap(source,sink,n*2+2)){        puts("YES");        for(int u=1;u<=n;++u){            for(int i=head[u];i!=-1;i=edge[i].next){                int v=edge[i].to;                if(v!=u+n&&edge[i].flow>0){//                    cout<<u<<" "<<v<<endl;////                    cout<<edge[i].flow<<endl;//                cout<<"---"<<endl;                    G[u][v-n]+=edge[i].flow;                }            }        }        for(int i=1;i<=n;++i){            int sum=0;            for(int j=1;j<=n;++j){                if(i==j) continue;                sum+=G[i][j];            }            G[i][i]=a[i]-sum;        }        for(int i=1;i<=n;++i){            for(int j=1;j<=n;++j){                printf("%d ",G[i][j]);            }            puts("");        }    }    else puts("NO");    return 0;}
0 0
原创粉丝点击