这次比赛我打的很不好……其实是因为懒
没写暴力
当时做掉了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.奥林匹克数据结构
正在思考中
评论 (0)