这次比赛我打的很不好……其实是因为懒
没写暴力
当时做掉了A,BC当时不会做,现在也不会做
所以暂时只有A的题解
A.奥林匹克五子棋
我们思考怎么摆放最优
首先我们发现每一行的摆放是否连通只和上一行的摆放方式有关
所以我们要尽量减少连通
想让上下不联通得左右放
想让左右不联通得上下放
那么我们就得到了一种摆放的方式
0101010101
0101010101
1010101010
1010101010
这样就可以完成目标了
#include<cstdio> #include<cstdlib> #include<cstring> #include<queue> #include<algorithm> using namespace std; int n,m,k; queue<pair<int,int> > Q1,Q2; int Abs(int x){return x>0?x:-x;} int main(){ freopen("A.in","r",stdin); freopen("A.out","w",stdout); scanf("%d %d %d",&n,&m,&k); if(k==1){puts("-1");return 0;} else if(k==2){if(n<2 || m<2){if(n==1)for(int i=1;i<=m;i++)printf("%d %d\n",1,i);else if(m==1)for(int i=1;i<=n;i++)printf("%d %d\n",i,1);}else puts("-1");return 0;} else if(k>min(n,m)){ for(int i=1;i<=n;i++){ if(i%2){if(m%2)for(int j=1;j<=m;j++)printf("%d %d\n",i,j);else for(int j=m;j;j--)printf("%d %d\n",i,j);} else for(int j=1;j<=m;j++)printf("%d %d\n",i,j); } return 0; } else if(k>2){ for(int i=1;i<=n;i++){ if(i%4==1 || i%4==2){for(int j=1;j<=m;j++){if(j&1)Q1.push(make_pair(i,j));else Q2.push(make_pair(i,j));}} else {for(int j=1;j<=m;j++){if(j&1)Q2.push(make_pair(i,j));else Q1.push(make_pair(i,j));}} } if(Abs(Q1.size()-Q2.size())>=2){ while(!Q1.empty())Q1.pop(); while(!Q2.empty())Q2.pop(); swap(n,m); for(int i=1;i<=n;i++){ if(i%4==1 || i%4==2){for(int j=1;j<=m;j++){if(j&1)Q1.push(make_pair(j,i));else Q2.push(make_pair(j,i));}} else {for(int j=1;j<=m;j++){if(j&1)Q2.push(make_pair(j,i));else Q1.push(make_pair(j,i));}} } if(Abs(Q1.size()-Q2.size())>=2){puts("-1");return 0;} else { int x=n*m,flg=1; while(x--){ if(flg){printf("%d %d\n",Q1.front().first,Q1.front().second);Q1.pop();} else {printf("%d %d\n",Q2.front().first,Q2.front().second);Q2.pop();} flg^=1; } } } else { int x=n*m,flg=1; while(x--){ if(flg){printf("%d %d\n",Q1.front().first,Q1.front().second);Q1.pop();} else {printf("%d %d\n",Q2.front().first,Q2.front().second);Q2.pop();} flg^=1; } } return 0; } return 0; }
B.奥林匹克环城马拉松
正在思考中
C.奥林匹克数据结构
正在思考中