不得不说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; }