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
- Codeforces Round #304 (Div. 2)——A.B.C.D.E
- Codeforces Round #186 (Div. 2)A、B、C、D、E
- Codeforces Round #258 (Div. 2)-(A,B,C,D,E)
- Codeforces Round #261 (Div. 2) A,B,C,D,E
- Codeforces Round #263 (Div. 2) A,B,C,D,E
- Codeforces Round #264 (Div. 2) A,B,C,D,E
- Codeforces Round #277 (Div. 2) A,B,C,D,E
- Codeforces Round #280 (Div. 2 A,B,C,D,E)
- Codeforces Round #287 (Div. 2) A、B、C、D、E
- Codeforces Round #287 (Div. 2)A,B,C,D,E
- Codeforces Round #288 (Div. 2) A,B,C,D,E
- Codeforces Round #293 (Div. 2) (A B C D E)
- Codeforces Round #308 (Div. 2) A B C D E
- Codeforces Round #312 (Div. 2) A B C D E
- Codeforces Round #311 (Div. 2) A,B,C,D,E
- Codeforces Round #320 (Div. 2) A B C D E
- Codeforces Round #330 (Div. 2)(A,B,C,D,E)
- Codeforces Round #346 (Div. 2) A B C D E
- 实时大数据设计策略
- 手把手教你打造一个Material Design风格的App(三)
- (二)“HelloWorld!”by Python
- jQuery以什么开头,结尾。。。
- Linux Shell脚本攻略(1.3)
- Codeforces Round #304 (Div. 2)——A.B.C.D.E
- 深入解析Windows第四版笔记
- POJ 2516 — Minimum Cost 费用流
- kmp模板
- 实时大数据处理性能瓶颈的测试
- Hadoop之——数据类型
- CSDN blog停更,已切博客园
- 实时大数据处理性能瓶颈
- android简易双屏支持