【Codeforces #167 Div1 Div2】Solutions
【A. Dima and Friends】
http://www.codeforces.com/contest/272/problem/A
題目大意:n+1個人出手指頭,加起來再做類似約瑟夫的出圈,問有多少種方法讓自己不出圈。
View Code 1 #include <iostream> 2 using namespace std; 3 4 int n,a,sum,cnt; 5 6 int main(){ 7 cin>>n; 8 for(int i=0;i<n;i++){ 9 cin>>a; 10 sum+=a; 11 } 12 for(int i=1;i<=5;i++) 13 if((sum+i)%(n+1)!=1) cnt++; 14 cout<<cnt<<endl; 15 return 0; 16 }?
【B.Dima and Sequence】
http://www.codeforces.com/contest/272/problem/B
題目大意:定義一個函數f(x),問給定數列an中有多少對函數值相同的數。
由函數的定義可以看出max{f(x)}并不非常大,由此可以記錄下每一個數的函數值進行統計。
View Code 1 #include <iostream> 2 using namespace std; 3 4 int n,a,val[10000010]; 5 long long cnt; 6 7 int f(int x){ 8 if(!x) return x; 9 return (x&1)?(f((x-1)>>1)+1):f(x>>1); 10 } 11 12 int main(){ 13 cin>>n; 14 for(int i=0;i<n;i++){ 15 cin>>a; 16 cnt+=val[f(a)]++; 17 } 18 cout<<cnt<<endl; 19 return 0; 20 }?
【C.Dima and Staircase】(A in Div1)
http://www.codeforces.com/contest/272/problem/C
題目大意:有一個樓梯,在樓梯第一層往下扔長為w,高為h的木塊,規則類似俄羅斯方塊,回答每個木塊底邊的高度。
樓梯高度是遞增的,當一個木塊落下時將影響1~w的所有高度,使他們的值相同。可以使用一個指針表示落下的木塊形成的最高平臺影響的區域1~p,并記錄1~p的最高高度,每次只需要修改指針即可。
View Code 1 #include <iostream> 2 using namespace std; 3 4 int a[100010],n,m,w,h,cur; 5 long long maxh; 6 7 int main(){ 8 cin>>n; 9 for(int i=1;i<=n;i++) 10 cin>>a[i]; 11 cin>>m; 12 for(int i=1;i<=m;i++){ 13 cin>>w>>h; 14 if(cur<w){ 15 if(a[w]>=maxh){ 16 cout<<a[w]<<endl; 17 maxh=a[w]+h; 18 cur=w; 19 }else{ 20 cout<<maxh<<endl; 21 maxh+=h; 22 cur=w; 23 } 24 }else{ 25 cout<<maxh<<endl; 26 maxh+=h; 27 cur=w; 28 } 29 } 30 return 0; 31 }?
【D.Dima and Two Sequences】(B in Div1)
http://www.codeforces.com/contest/272/problem/D
題目大意:有2*n個點,問有多少種方法使得他們按x坐標不減排序。
對于x坐標相同的點,一共有種排列方法,但是關鍵問題是其中有重復的點,重復的點互相交換位置不引起方案的變化,設重復點有k個,則方案數為。
因為除數只含有因子2,且被除數含有的因子2一定比分母含有的多,所以在算階乘的時候逐個除去因子2。
最后各個不同x坐標的方案數的乘積為答案。
View Code 1 #include <iostream> 2 #include <utility> 3 #include <algorithm> 4 using namespace std; 5 typedef pair<int,int> PII; 6 7 int x,n,BASE,t,same; 8 PII p[200010]; 9 long long ans=1; 10 11 int main(){ 12 cin>>n; 13 for(int i=0;i<2*n;i++){ 14 cin>>x; 15 p[i]=PII(x,i%n); 16 } 17 cin>>BASE; 18 sort(p,p+2*n); 19 int i=0,j=0; 20 while(i<2*n){ 21 while(j<=2*n && p[j+1].first==p[j].first) 22 if(p[++j].second==p[j-1].second) same++; 23 for(int k=2;k<=j-i+1;k++){ 24 t=k; 25 while(!(t&1) && same) t/=2,same--; 26 ans=(ans*t)%BASE; 27 } 28 i=++j; 29 } 30 cout<<ans<<endl; 31 return 0; 32 }
【E.Dima and Horses】(C in Div1)
http://www.codeforces.com/contest/272/problem/E
題目大意:有一群馬,馬之間有仇恨關系,將馬分成兩組,使得任意一匹馬在分組中最多只有一個仇恨關系。
因為m最大是n(n-1)/2,所以應該沒有無解的情況。。仇恨關系不超過三個,所以dfs一下就可以了。
View Code 1 #include <iostream> 2 using namespace std; 3 4 int n,m,x,y,f[300010],a[300010][4]; 5 6 void dfs(int x){ 7 int cnt=0; 8 for(int i=1;i<=a[x][0];i++) 9 cnt+=f[x]==f[a[x][i]]; 10 if(cnt>1){ 11 f[x]^=1; 12 for(int i=1;i<=a[x][0];i++) 13 if(f[x]==f[a[x][i]]) dfs(a[x][i]); 14 } 15 } 16 17 int main(){ 18 cin>>n>>m; 19 while(m--){ 20 cin>>x>>y; 21 a[x][++a[x][0]]=y; 22 a[y][++a[y][0]]=x; 23 } 24 for(int i=1;i<=n;i++) 25 dfs(i); 26 for(int i=1;i<=n;i++) 27 cout<<f[i]; 28 }?
【D.Dima and Figure】(Div 1)
http://www.codeforces.com/contest/273/problem/D
轉載于:https://www.cnblogs.com/Delostik/archive/2013/02/14/2911239.html
總結
以上是生活随笔為你收集整理的【Codeforces #167 Div1 Div2】Solutions的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 编辑器制作的一些资源
- 下一篇: CentOS6.0搭建DNS