http://codeforces.com/contest/334
A题意:1-n^2 平均分成 n 份,每份n个数,且和相同
解法 : 构造矩阵1-n^2的矩阵即可
int a[105][105]; int main() { int n; scanf("%d",&n); int k = n*n; int c = 1; for(int i = 0 ; i < n ; i++) for(int j = 0 ; j < n ; j++) a[i][j] = c++;} for(int i = 0 ; i < n ; i++) { for(int j = 0 ; j < n ; j++) printf("%d ",a[j][(i+j)%n]); puts(""); } return 0; }
B:8个点能否关于矩形对称
解法: 直接暴力判断8个点,注意判重
struct point { int x,y; }p[8]; int cmp(point a,point b){ if(a.x == b.x) return a.y<b.y; return a.x < b.x; } int main() { for(int i =0 ; i < 8 ; i++) cin>>p[i].x>>p[i].y; sort(p,p+8,cmp); for(int i = 0 ; i < 8 ; i++) for(int j = 0 ; j < 8 ; j++) if(i != j && p[i].x == p[j].x && p[i].y == p[j].y) { cout<<"ugly"<<endl; return 0; } if(p[0].x == p[1].x && p[1].x == p[2].x && p[3].x == p[4].x && p[5].x == p[6].x && p[6].x == p[7].x) { if(p[0].y == p[3].y && p[3].y == p[5].y && p[1].y == p[6].y && p[2].y == p[4].y && p[4].y == p[7].y) cout<<"respectable"<<endl; else cout<<"ugly"<<endl; }else cout<<"ugly"<<endl; return 0; }
C题意: 用面值为3的次幂的硬币 购买价值为n的商品 , 要求硬币总价值>n且硬币数最多且这些硬币的子集不能>=n
解法 : 贪心,如果非3的倍数一定是n/3+1 即全换成3
否则就不能换成3要换成面值更大的 以此类推直到不为3^k为止
int main() { LL n; cin>>n; while(n % 3 == 0) n /= 3; cout<<(n/3)+1<<endl; }
D题意: 在n*n矩阵中 有一些不能走的格子, 从边界(非顶角)出发 能直线走到对面边界的最多方案数
解法 : 如果中间没有不能走的格子 ,对于在(x,x)上相交的十字形一共有2种不冲突的放法
可以证出: 其中一定存在一种对其他情况不影响走法 ----------------------------------画图可归纳
奇数情况特判中间点即可
bool bx[1005],by[1005]; int n,m; int main() { //freopen("in.txt","r",stdin); cin>>n>>m; while(m--) { int x,y; cin>>x>>y; bx[x] = 1; by[y] = 1; } int res = 0; for(int i = 2; i < n ; i++) { if(bx[i] == 0) res++; if(by[i] == 0) res++; } if(n%2 == 1 && bx[n/2+1] == 0 && by[n/2+1] == 0) res--; cout<<res<<endl; return 0; }