Codeforces Round #102 (Div. 2) //缺E
-----------------------
A. Help Vasilisa the Wise 2
---
暴力枚举
---
#include <iostream> using namespace std; int r1,r2,c1,c2,d1,d2; int a[2][2]; bool solve() { if (a[0][0]+a[0][1]!=r1) return false; if (a[1][0]+a[1][1]!=r2) return false; if (a[0][0]+a[1][0]!=c1) return false; if (a[0][1]+a[1][1]!=c2) return false; if (a[0][0]+a[1][1]!=d1) return false; if (a[0][1]+a[1][0]!=d2) return false; return true; } int main() { bool flag=false; cin>>r1>>r2>>c1>>c2>>d1>>d2; for (int i=1; i<=9; i++){ for (int j=1; j<=9; j++){ if (i==j) continue; for (int k=1; k<=9; k++){ if (k==i||k==j) continue; for (int l=1; l<=9; l++){ if (l==i||l==j||l==k) continue; a[0][0]=i; a[0][1]=j; a[1][0]=k; a[1][1]=l; if (solve()){ flag=true; break; } } if (flag) break; } if (flag) break; } if (flag) break; } if (flag){ for (int i=0;i<2;i++){ for (int j=0;j<2;j++){ cout<<a[i][j]<<" "; } cout<<endl; } } else{ cout<<-1<<endl; } return 0; }-----------------------
B. Help Kingdom of Far Far Away 2
----
对字符串处理
----
#include <iostream> #include <cstring> #include <cstdio> using namespace std; char s[1111]; char a[111],b[111]; int main() { bool dec=false; bool dot=false; cin>>s; if (s[0]=='-') dec=true; int len=strlen(s); int la=0,lb=0; for (int i=dec;i<len;i++){ if (s[i]=='.'){ dot=true; continue; } if (!dot) a[la++]=s[i]; else b[lb++]=s[i]; } a[la]=0; b[lb++]='0'; b[lb++]='0'; b[lb]=0; len=0; if (dec) s[len++]='('; s[len++]='$'; int m=la; for (int i=0;i<la;i++){ if (m%3==0&&m!=la) s[len++]=','; m--; s[len++]=a[i]; } s[len++]='.'; for (int i=0;i<2;i++) s[len++]=b[i]; if (dec) s[len++]=')'; s[len]=0; cout<<s<<endl; return 0; }-----------------------
C. Help Farmer
---
枚举剩下的n块方格能拼成的立方体。
对每一种可能的立方体尝试3种可能的被切割方式(A-2)(B-2)(C-1).....(A-1)(B-2)(B-2)......
取其中的最大值和最小值。
---
#include <iostream> using namespace std; typedef long long LL; const LL INFF=(1LL << 60); int main() { LL n,m,c,res; LL Max=0,Min=INFF; cin>>n; for (LL i=1;i*i<=n;i++){ if (n%i==0){ m=n/i; for (LL j=1;j*j<=m;j++){ if (m%j==0){ c=m/j; res=(i+1)*(j+2)*(c+2)-n; Max=max(Max,res); Min=min(Min,res); res=(i+2)*(j+1)*(c+2)-n; Max=max(Max,res); Min=min(Min,res); res=(i+2)*(j+2)*(c+1)-n; Max=max(Max,res); Min=min(Min,res); } } } } cout<<Min<<" "<<Max<<endl; return 0; }
-----------------------
D. Help General
---
令1表示有马,0表示无马。
当n=1或m=1时
1111111111..... 为最佳排列
当n=2或m=2时
110011001100.....
110011001100.....为最佳排列
其他情况下
1010101010....
0101010101....
1010101010...
0101010101...最佳
---
#include <iostream> using namespace std; int main() { int n,m; cin>>n>>m; if (n==1||m==1){ cout<<n*m<<endl; return 0; } if (n==2||m==2){ if (n<m) swap(n,m); int c=(n/4)*2; if (n%4>0) c++; if (n%4>1) c++; cout<<c*2<<endl; return 0; } int a,b,c,d; a=(n+1)/2; b=(m+1)/2; c=n/2; d=m/2; cout<<a*b+c*d<<endl; return 0; }
-----------------------