loli的搜索测试-5
今天早上听说不放假感觉很sad,又听说要考试感觉更sad了,早读的时候Juan_feng表示即使考也不会考虫食算,结果上午并没有考试,就自己做了几道题。不得不说做题的决定实在是太明智了,做NOIP历年真题,发现蓝题及以下的搜索题所剩不多,就做了一道引水入城(更巧的是今天洛谷的智推给我推了这个题),感觉思路很妙,唯一有一点不足就是90改到100的过程中只是机械的搬了题解的思路,并没有明白两种写法的区别。
下午听说要放假,感觉非常开心,结果loli过来找我们说要考试...这就很sad了。点开题目文件一看,感到非常震惊。T1是英文题面,T2是...虫食算!T3是...引水入城!于是就开始做T2,T3,水完之后就开始看T1,首先看的是题目中给出的翻译,可是翻译的质量比较差以至于看不懂,就花了10分钟去看英文的题面,感觉非常不可做呢...后来觉得即使是暴力也得打打才行,所以写了挺长时间弄完了这道题,愉快的跑回了学长学姐们的机房。过了一会loli看到我们在这里,就说不要好高骛远,要脚踏实地的学习,不过我说我会做的题都做完了,于是就被批准留在这里。晚饭后并没有回我们的机房看成绩,然而老师把我们叫回去看。一点开测评包$180$,感觉布星,点开详细信息发现T1爆零,T2超时一个点,T3错了一个点,关键是和上午错的一样,所以说上午的题我果然还是没有理解呢。后来仔细想了一下,又写了总结,突然明白为什么会错了。
在引水入城这道题中,一个比较重要的性质是每个点覆盖的区间是连续的,这个问题以前我是感性认识的,后来画了图才明白这个结论有一个前提是有解,所以在无解的情况下覆盖的区间不一定连续。在错误的写法中,我是这样判断无解时不能被覆盖的点的个数的:两重循环,外层循环沙漠点,内层循环河岸,用河岸覆盖区间的左右端点来卡沙漠点,如果所有的区间都无法覆盖证明这是一个无法被浇灌的点,但是现在我明白了,在无解的情况下用区间的左右端点去卡是不正确的,所以正确的方法是查看$vis$数组,看看每个沙漠点是否曾被访问过。
后来发现T1的数据和题目描述不符,改了数据之后我惊奇的发现这题我竟然A了,总分达到了惊人的$280$,果然是暴力出奇迹,比较开心。
T1 Painting A Board:http://bailian.openjudge.cn/practice/1691/
1 # include <cstdio> 2 # include <iostream> 3 # include <cstring> 4 # define R register int 5 6 using namespace std; 7 8 int m,n,ans; 9 int a[20],b[20],c[20],d[20],co[20],g[105][105]; 10 int fir[20][20],pai[20]; 11 bool visc[21]; 12 13 void dfs(int x,int s,int colo) 14 { 15 if(x==n+1) 16 { 17 ans=min(ans,s); 18 return ; 19 } 20 if(s>=ans) return ; 21 bool f; 22 for (R i=1;i<=n;++i) 23 { 24 f=true; 25 if(pai[i]) continue; 26 for (R j=1;j<=n;++j) 27 { 28 if(fir[i][j]&&pai[j]==false) 29 { 30 f=false; 31 break; 32 } 33 } 34 if(f==false) continue; 35 pai[i]=true; 36 if(co[i]==colo) 37 dfs(x+1,s,colo); 38 else 39 dfs(x+1,s+1,co[i]); 40 pai[i]=false; 41 } 42 } 43 44 int main() 45 { 46 scanf("%d",&m); 47 while(m--) 48 { 49 ans=1000; 50 memset(co,0,sizeof(co)); 51 memset(fir,0,sizeof(fir)); 52 memset(g,0,sizeof(g)); 53 scanf("%d",&n); 54 for (R i=1;i<=n;++i) 55 { 56 scanf("%d%d%d%d%d",&a[i],&b[i],&c[i],&d[i],&co[i]); 57 visc[co[i]]=true; 58 for (R j=a[i]+1;j<=c[i];++j) 59 for (R k=b[i]+1;k<=d[i];++k) 60 g[j][k]=i; 61 } 62 for (R i=1;i<=n;++i) 63 { 64 if(a[i]==0) continue; 65 for (R j=b[i]+1;j<=d[i];j++) 66 fir[i][g[a[i]][j]]=1; 67 } 68 for (R i=1;i<=20;++i) 69 if(visc[i]) dfs(1,1,i); 70 printf("%d\n",ans); 71 } 72 return 0; 73 }
T2 虫食算:https://www.luogu.org/problemnew/show/P1092
T3 引水入城:https://www.luogu.org/problemnew/show/P1514
然后这里再加一个wzx dalao的测试总结作为结束:(他还没写 (他还是没写
---shzr