codeforces 359A- Table
不得不说codeforces上的题目,思维真的很活跃。
上一期的A题,写了那么多,这个题我也用最朴实的想法来写的时候,发现超时了!!!【代码二】
有提交错误时的测试数据得出:输出的数据只有2种可能“2”和“4”
经过对题目的本质的分析,题目的格子处理只有2种可能:
<1>“好格子”都在中间,选任意一个“好格子”,需要涂4次,可将棋盘全部涂满;
<2>“存在”位于边界的“好格子”,选任意一个边界上的“好格子”,需要涂2次即可将棋盘全部涂满。
找到本质后,题目就是“so easy!”!
对输入的棋盘的“好格子”的情况进行处理,要是有处于边界上的“好格子”,直接输出“2”;否则,直接输出“4”。
(见【代码一】)
【代码一】
#include<stdio.h>
int main()
{
int n,m;
int u;
int i,j;
while(scanf("%d%d",&n,&m)!=EOF)
{
int flag=0;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%d",&u);
if(u)
if(i==0||i==n-1||j==0||j==m-1) //边界有good cell
flag++;
}
if(flag)printf("2\n");
else printf("4\n");
}
return 0;
}
【代码二
//Warnning:This is the TLE code , please don't copy it for study!
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
using namespace std;
int n,m; //the size of the table
int map[52][52]; //the table ,the "0" is where wait for paint
int gn; //good point number
int sum; //all the number of point need to be paint
int ans; //the step to paint all the point ,the ans what we need
int x1,y1,x2,y2;
struct node //the infromation of the good point
{
int x;
int y;
int max; //the max point can paint if we choice this good point
int maxdir; //the direction the max point can paint1 2
// 3 4
}gp[2500];
bool cmp(node a,node b) //to sort the good point by it's max point can be paint
{
return b.max-a.max;
}
void initial() //initial the infromations
{
int u;
int i,j;
ans=0;
sum=n*m;
gn=0;
memset(map,0,sizeof(map));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&u);
if(u)
{
gp[gn].x=i;
gp[gn].y=j;
gn++;
}
}
}
void chang() //choice one good point and paint some point
{
int i,j;
sum-=gp[0].max;
if(gp[0].maxdir==1)
{
x1=1;x2=gp[0].x;
y1=1;y2=gp[0].y;
}
else if(gp[0].maxdir==2)
{
x1=1;x2=gp[0].x;
y1=gp[0].y;y2=m;
}
else if(gp[0].maxdir==3)
{
x1=gp[0].x;x2=n;
y1=1;y2=gp[0].y;
}
else
{
x1=gp[0].x;x2=n;
y1=gp[0].y;y2=m;
}
for(i=x1;i<=x2;i++)
for(j=y1;j<=y2;j++)
map[i][j]=1;
}
int cout1()
{
int cou=0;
int i,j;
for(i=x1;i<=x2;i++)
for(j=y1;j<=y2;j++)
if(!map[i][j])cou++;
return cou;
}
void updata() //updata all the point number the good point can paint
{
int i,j,k;
int maxn;
for(k=0;k<gn;k++)
{
gp[k].max=0;
x1=1;x2=gp[0].x;
y1=1;y2=gp[0].y;
maxn=cout1();
if(maxn>gp[k].max)
{
gp[k].max=maxn;
gp[k].maxdir=1;
}
x1=1;x2=gp[0].x;
y1=gp[0].y;y2=m;
maxn=cout1();
if(maxn>gp[k].max)
{
gp[k].max=maxn;
gp[k].maxdir=2;
}
x1=gp[0].x;x2=n;
y1=1;y2=gp[0].y;
maxn=cout1();
if(maxn>gp[k].max)
{
gp[k].max=maxn;
gp[k].maxdir=3;
}
x1=gp[0].x;x2=n;
y1=gp[0].y;y2=m;
maxn=cout1();
if(maxn>gp[k].max)
{
gp[k].max=maxn;
gp[k].maxdir=4;
}
}
sort(gp,gp+gn,cmp);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
initial();
updata();
while(sum)
{
ans++;
if(sum==gp[0].max)break;
chang();
updata();
}
cout<<ans<<endl;
}
return 0;
}