Codeforces Round #304 (Div. 2)
生活随笔
收集整理的這篇文章主要介紹了
Codeforces Round #304 (Div. 2)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
這次打得較差,差點就綠了。。。
B題,這B題竟然WA了,再看看就發現一個很嚴重的錯誤。。--!
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring>using namespace std;int num[3050];int main(){int n;while(scanf("%d",&n)!=EOF){for(int i=0;i<n;i++){scanf("%d",&num[i]);}sort(num,num+n);int cnt=0,ans=0;for(int i=1;i<n;i++){if(num[i]==num[i-1]){cnt++;}else {int k=num[i]-num[i-1]-1;if(k>=cnt){ans=ans+(1+cnt)*cnt/2;cnt=0;}else{ans=ans+(1+k)*k/2;cnt-=k;}ans=ans+cnt*(k+1);}}if(cnt>0){ans=ans+(1+cnt)*cnt/2;}printf("%d\n",ans);}return 0; }
D題,可以預處理出各個數個含的質數的個數,可以用循環處理,求前綴和。循環是,從2開始,d記錄下它有沒有質因子,d=0則證明它當前是素數,第二層對j=i*k這樣的數求它含有i的個數。如果d不為0,說明它不是素數,且由于一直循環,所以處理到它時就是已經把它所有質因子個數算出來了。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define LL long long using namespace std; const int N=5000000; int d[N+10]; int s[N+10];void initial(){memset(d,0,sizeof(d));s[0]=s[1]=0;for(int i=2;i<=N;i++){if(d[i]==0){d[i]++;for(int j=i+i;j<=N;j+=i){int c=j;while(c%i==0){d[j]++;c/=i;}}}s[i]=s[i-1]+d[i];} }int main(){initial();int T,a,b;scanf("%d",&T);while(T--){scanf("%d%d",&a,&b);printf("%d\n",s[a]-s[b]);}return 0; }
E題,二分圖網絡流
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm>using namespace std; /* 這道在開始也在想網絡流,但是,看到只能移動一條邊時,就無語了。。群里一討論,對哦,二分圖拆點建邊, 這樣就是一條邊了。。。T_T我果然是渣。。 s->i建一條a[i]的邊,i+n->e建一條b[i]的邊。u-v就按u->v',v->u'。 注意加上u->u' */const int INF=0x3f3f3f3f; const int MAXN=300;//點數的最大值 const int MAXM=2000;//邊數的最大值struct Node {int from,to,next;int cap; }edge[MAXM]; int tol;int dep[MAXN];//dep為點的層次 int head[MAXN]; int flow[MAXN][MAXN]; int n,m; void init() {tol=0;memset(head,-1,sizeof(head)); } void addedge(int u,int v,int w)//第一條變下標必須為偶數 {edge[tol].from=u;edge[tol].to=v; edge[tol].cap=w; edge[tol].next=head[u];head[u]=tol++;edge[tol].from=v;edge[tol].to=u;edge[tol].cap=0;edge[tol].next=head[v];head[v]=tol++; }int BFS(int start,int end) {int que[MAXN];int front,rear; front=rear=0;memset(dep,-1,sizeof(dep));que[rear++]=start;dep[start]=0;while(front!=rear){int u=que[front++];if(front==MAXN)front=0;for(int i= head[u];i!=-1; i=edge[i].next){int v=edge[i].to;if(edge[i].cap>0&& dep[v]==-1){dep[v]=dep[u]+1;que[rear++]=v;if(rear>=MAXN) rear=0;if(v==end)return 1;}}}return 0; } int dinic(int start,int end) {int res=0;int top;int stack[MAXN];//stack為棧,存儲當前增廣路int cur[MAXN];//存儲當前點的后繼while(BFS(start,end)){memcpy(cur,head, sizeof(head));int u=start;top=0;while(1){if(u==end) //到達匯點{int min=INF;int loc;for(int i=0;i<top;i++)if(min>edge[stack[i]].cap){min=edge[stack[i]].cap;loc=i;}for(int i=0;i<top;i++){edge[stack[i]].cap-=min;edge[stack[i]^1].cap+=min;}res+=min; top=loc; // 以最小邊的起點為源點再尋找其他增廣路徑u=edge[stack[top]].from;}for(int i=cur[u];i!=-1;cur[u]=i=edge[i].next) //尋找可增廣的路徑,即確定edge[]中以u為起點可增廣的i的第一條邊的位置if(edge[i].cap!=0 && dep[u]+1==dep[edge[i].to])break;if(cur[u]!=-1){stack [top++]=cur[u];u=edge[cur[u]].to;}else{if(top==0) break; //不能再增廣dep[u]=-1;u= edge[stack [--top] ].from; //退棧尋找下一條}}}return res; }int bef[MAXN],aft[MAXN];int main(){int s,e;while(scanf("%d%d",&n,&m)!=EOF){init();int sum=0; s=0; e=2*n+1;memset(flow,0,sizeof(flow));for(int i=1;i<=n;i++){scanf("%d",&bef[i]);sum+=bef[i];}int cp=sum;for(int i=1;i<=n;i++){scanf("%d",&aft[i]);sum-=aft[i];}for(int i=1;i<=n;i++){addedge(s,i,bef[i]);addedge(i+n,e,aft[i]);addedge(i,i+n,INF);}int u,v;for(int i=1;i<=m;i++){scanf("%d%d",&u,&v);addedge(u,v+n,INF);addedge(v,u+n,INF);}if(sum!=0){printf("NO");}else{int res=dinic(s,e);if(res!=cp){puts("NO");}else{puts("YES");for(int i=n+1;i<=2*n;i++){int v=i-n;for(int ei=head[i];ei!=-1;ei=edge[ei].next){int u=edge[ei].to;if(u<e){flow[u][v]=edge[ei].cap;}}}for(int i=1;i<=n;i++){printf("%d",flow[i][1]);for(int j=2;j<=n;j++)printf(" %d",flow[i][j]);printf("\n");}}}} }
轉載于:https://www.cnblogs.com/jie-dcai/p/4523897.html
總結
以上是生活随笔為你收集整理的Codeforces Round #304 (Div. 2)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关中断是否禁止任务调度?关中断能作为互斥
- 下一篇: jq checked 设置问题