您的位置:首页 > 其它

noip 2014年提高组大总结

2017-07-16 13:38 232 查看
发现自己和强省的学生比起来,还是很差劲很差劲,网上的所有分析都说14年的题很简单,从来没没有做过这么简单的,而且分数线确实真的很高啊。难受。

讲一下这套题。按照我心中它的难易程度排序,由易到难。

1.生活大爆炸版石头剪刀布(rps)

2.无限网路发射器选址(wrieless)

这两道题,是真的简单。都是模拟,第一个题是把所有可能出现的情况写在if中,或者用switch,然后再循环天数即可。第二题直接枚举,把所有情况枚举出来就能过。

3.寻找道路(road)这道题的方法很多很多,题型就是最短路题型。但是这里要判断一下能否走到。dfs,bfs均可以完成。

void bfs1(){
int head=0,tail=1;
q[0]=T;vis[T]=1;
while(head!=tail){
int now=q[head];head++;
for(int i=last[now];i;i=e[i].next)
if(!vis[e[i].to]){
vis[e[i].to]=1;
q[tail++]=e[i].to;
}
}
}


有一种打通经脉的感觉是吧。通的不通的在vis中存着呢。

只需要如此

bool che(int now){

for(int i=last[now];i;i=e[i].next)  if(!vis[e[i].to])return 0;

return 1;

}


因为只要路上有这个点,就肯定过不了了。

然后再从起点广搜一次即可,写法都差不多,加一个判断(che)。

4.联合权值

注意到n个点n-1条边,说明了这是一棵树,每两个点之间只有一条路径,因为距离为2,这一条路径必定经过一个点,而这两个点在这一个点的左右,那么思路来了,我们可以枚举中间的一个点,然后枚举它所连到的另外两个点,去最大值和第二大值.可以用邻接表来实现.那么怎么求和最好呢?假设一个点与a,b,c相连.那么和就是a * b + a * c + b * a + b * c + c * a + c * b = a * (b + c) + b * (a + c) + c * (a + b),可以注意到这是一个对称式,a,b,c是不能化简得,那么后一项发现是总的和减去前一项,那么算法就出来了,设o = a + b + c,那么sum = a * (o - a) + b * (o - b) + c * (o - c),不过注意到和需要取余。当然,网上很多解析都是用树形dp,我都忘了,不过的确是很典型的树形dp。

5.飞扬的小鸟

呵呵,完全没有想到是个完全背包啊,想到了应该是做得起的,不过我拿到最后一道题,就只知道爆搜,而且这次还看错了条件,只骗到10分呜呜。每个阶段解决向上或者向下,而且次数不限,类似于物品个数没有限制。所以f[i][j]的状态可以从f[i-1][]和f[i][]中转移过来。

f(i,j)->f(i-1,j-X[i-1])+1

->f(i,j-X[i-1])+1

->f(i-1,j+Y[i-1])

6.数学不行,我只能骗分而已,搞了30分。

看了下网上的,大神们各种秀数学,天下无敌。

引理:若f(x)≡0(mod p),则f(x+p)≡0(mod p).

简单说起来,就是可以先取一个小质数P,求出[1,P)内所有的解,然后可以通过+P推得在[1,m]内所有符合f(x)≡0(mod P),再用另一个大质数p,用来check每个解即可。

这次代码质量不高,就不提供了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: