codeforces#254DIV2解题报告
今天簡直大爆發啊。。。
吃了頓燒烤竟然這么管事。
。
。
。。
本弱渣竟然做出來了3道,并且B題是我第一次在CF中用到算法。。(曾經最多也就是貪心。
。
。
)。
題目地址:codeforces#225
A題:
水題。。
不解釋。。
5分鐘1Y。
代碼例如以下:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #include<algorithm>using namespace std; int main() {int n, m, i, j;char s[200][200];scanf("%d%d",&n,&m);for(i=0;i<n;i++){scanf("%s",s[i]);}for(i=0;i<n;i++){for(j=0;j<m;j++){if(s[i][j]=='-'){printf("-");continue ;}if((i+j)%2){printf("B");}elseprintf("W");}printf("\n");}return 0; }B題:
這題第一次在CF中使用算法,剛開始還猶豫了一段時間,由于沒見過在B題中就用到算法的,后來還是大膽的用上了。
。
。
并且還是并查集。。這題就是把能夠反應的藥品用并查集放在一塊,這樣分成了能夠互不反應的幾個集合。這種話,最少不能反應的就是每一個集合放進去的第一個,剩下的就是最多能夠發生反應的藥品數量。把數量求出來。如果是n,再求2^n就可以。
注意要用int64,第一次由于這個錯了一次。
。不然就能進前100了。。。
sad。
。
代碼例如以下:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #include<algorithm>using namespace std; int bin[100]; int find1(int x) {return bin[x]==x?x:bin[x]=find1(bin[x]); } void merge1(int x, int y) { int f1, f2; f1=find1(x); f2=find1(y); if(f1!=f2) { if(f2>f1) bin[f2]=f1; else bin[f1]=f2; } } int main() { int n, m, i, j, a[100], x, y, b[100], z, num, nn; __int64 s=1; scanf("%d%d",&n,&m); memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); for(i=1;i<=n;i++) bin[i]=i; num=0; nn=0; while(m--) { scanf("%d%d",&x,&y); merge1(x,y); a[x]++; a[y]++; } for(i=1;i<=n;i++) { if(a[i]) { z=find1(i); b[z]++; num++; } } for(i=1;i<=n;i++) { if(b[i]) { nn++; } } z=num-nn; //printf("%d %d\n",num,nn); for(i=1;i<=z;i++) { s*=2; } printf("%I64d\n",s); return 0; }
C題:
這題還是非常有意思的。。
第一次看完以為是什么最大密度子圖。由于近期刷網絡流,網絡流的最小割能夠求最大密度子圖,可是還沒學。。。。我還百度看了一會兒。
。
。后來想到能夠貪心,先把兩個點與相連的邊值之比的最大值求出來,然后依次向外擴充,這樣肯定可行,可是感覺非常麻煩。。并且復雜度有點懸。
。。但還是硬著頭皮寫了。然后當寫完最大的那一邊二點的值時。突然發現再往后擴充肯定越來越小。
。。然后自己YY了一下證明。。這樣是能夠證明的,于是果斷提交。1Y~
代碼例如以下:
#include <iostream> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> #include <ctype.h> #include<algorithm>using namespace std; int main() {int n, m, i, p[600], u, v, w;double max1=0, x;scanf("%d%d",&n,&m);for(i=1;i<=n;i++)scanf("%d",&p[i]);while(m--){scanf("%d%d%d",&u, &v,&w);x=(p[u]+p[v])*1.0/w;if(max1<x){max1=x;}}printf("%.15lf\n",max1);return 0; }
總結
以上是生活随笔為你收集整理的codeforces#254DIV2解题报告的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有1、2、3、4个数字,能组成多少个互不
- 下一篇: tomcat 的 start/stop