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 }
Paintint A Board

 

  T2 虫食算:https://www.luogu.org/problemnew/show/P1092

  T3 引水入城:https://www.luogu.org/problemnew/show/P1514

 

  然后这里再加一个wzx dalao的测试总结作为结束:(他还没写 (他还是没写

 

  ---shzr

posted @ 2018-06-29 20:24  shzr  阅读(205)  评论(0编辑  收藏  举报