NOIp/NOI
文章平均质量分 59
深蓝色的猫
一个努力成长为大牛的蒟蒻程序媛
展开
-
NOIp2010 数字统计
1、最近得到一些noip题目的测试数据,想用这些题目来查漏补缺。2、暴力法是可以的,但是用递推更加方便、快捷。#include#includeusing namespace std;int main(){ int L,R,ans; int a[10010]; while(scanf("%d%d",&L,&R)==2){ mem原创 2013-10-17 21:49:15 · 346 阅读 · 0 评论 -
[JSOI2008]最大数maxnumber
1、用单调递减的栈维护最优值。栈里保存的是下标,对应的数字满足递减的规律。所以,每次加入一个数的时候,就要将小于等于它的数字出栈,因为他们既是下标靠前,数值也不占优势,如果从末尾选最大值的话,怎么也轮不到他们,所以出栈。2、用lower_bound查找第一个大于等于最小下标的值,则得到最优解。#include#includeusing namespace std;int num原创 2014-01-11 17:34:17 · 307 阅读 · 0 评论 -
[ZJOI2007]报表统计
1、本题我做不出来,所以参考了CLJ的代码(其实是照搬吧喂),理解了一下,发现思路非常巧妙,顺便学习了一下STL的set和priority_queue。2、题目有三个要求:1、在初始队列的第i个数后插入元素。2、返回相邻数的绝对值的最小值。3、返回所有数中两个数差值的最小值。由于数字是动态添加的,所以需要动态地维护。set可以用来做第三问,priority_queue可以用来做第二问,至于第一原创 2014-01-11 21:55:24 · 307 阅读 · 0 评论 -
[HNOI2008]越狱
1、这应该算是省选题中比较简单的了吧。考察排列组合,用所有的可能减去绝不相同的数量,就是可能的越狱数。要用到一个快速幂取模算法。#includeusing namespace std;const int mod=100003;long long power(long long x,long long base){ if(x==0) return 1; long原创 2014-01-12 23:00:35 · 233 阅读 · 0 评论 -
[CQOI2009]中位数图
1、这题一个比较聪明的做法是引入c数组来记录大于b和小于b的差值,从而变成了O(n)的算法。2、本题的数列是一个“排列”,所以说,b只会出现一次,不用考虑1 1 1之类的情况。3、由于出现负值,所以所得值要加上maxn,我刚开始c数组只开了maxn,所以WA,应该开2*maxn(最大maxn,最小负maxn)。#include#includeusing namespace st原创 2014-01-13 19:14:19 · 260 阅读 · 0 评论 -
[HNOI2006]马步距离
1、这道题还真是厉害啊,数据超大,采用先贪心再bfs的策略。首先,尽量沿对角线接近目标,等距离在10以内的时候开始bfs暴搜。。。2、代码不是我写的,只是学习一下。。。 #include#include#include#include#include#define rep(i,n) for(int i=0;iusing namespace std;typed原创 2014-01-24 00:30:43 · 457 阅读 · 0 评论 -
[HNOI2006]超级英雄Hero
1、本题是一道二分图最大匹配的变形,学了一下增广路算法,还是挺好写的。2、由于答题是按顺序的,一旦答错就不能再答,所以依题目顺序寻找,尽量找到最大匹配。3、第一题(点1)是未盖点,从点1开始寻找增广路,直到找到另一个未盖点为止(此时算作找到一条增广路),然后在dfs里顺便更新一下匹配边。4、接着找第二题(点2)的增广路,注意一旦找过的不用再找,因此找过的结点要用vis数组标记,当然了,原创 2014-01-23 20:55:50 · 363 阅读 · 0 评论 -
NOIp2002 选数
1、刚开始把dfs里的num写成n了,居然过了样例,结果只过了一个数据。如果是正式比赛,就杯具了。以后交题前要检查一遍代码,最好自己编几个数据测一测。#include#includeusing namespace std;int a[25],n,k,ans;bool is_prime(int num){ int m=(int)sqrt(num+0.5); fo原创 2014-01-25 21:34:23 · 340 阅读 · 0 评论 -
NOIp2001 求先序排列
1、现在写递归也比较熟练了。。。#include#includeusing namespace std;char s1[10],s2[10],s3[10];int len,pos;void find(char*s1,char*s2,int num){ if(num s3[pos++]=s2[num-1]; int temp=strchr(s1,s2[num原创 2014-01-25 22:10:16 · 494 阅读 · 0 评论 -
NOIp2002 马拦过河卒
1、本题不难,但是我做了很久,第一个原因是未把“马”的位置设成非法点,也就是读题非常马虎。第二个就是没有用long long型输出。我以为只是一个20*20的棋盘,所有的走法数应该是不会超过整型范围的,事实证明,我还是太年轻了~#include#includeusing namespace std;bool invalid[25][25];int n,m,x,y;bool原创 2014-01-24 16:53:12 · 429 阅读 · 0 评论 -
NOIp2005 采药
1、0-1背包问题,注意可以不装满。推荐《背包九讲》。#include#include#includeusing namespace std;struct node{ int t,v;}a[110];int dp[10010];int T,M;void ZeroOnePack(int cost,int weight){ for(int j=T原创 2014-01-16 22:02:25 · 456 阅读 · 0 评论 -
NOIp1996 挖地雷
1、这道题在DP的分类里,所以我首先考虑用DP做,但是由于是无向图,还有环,还不连通,所以用DP很困难(或者不可能),到群里问了才知道用搜索,但是我一直担心超时。虽然如此,也没有别的办法,抱着国内题目数据很水这个想法,写了回溯法+判重,果断AC~2、注意的就是图可能不连通,所以输出点不一定是n个,还有别忘了判重。用一个数组c记录最优路径,用数组b记录当前路径,cnt记录路径长度(小于等于n)。原创 2013-12-03 23:30:12 · 738 阅读 · 0 评论 -
NOIp2008 ISBN
1、为什么要做普及组的题目?因为容易错。。。这道题交了N遍,主要是因为X这个字符的特殊处理容易错,还有就是两个if之后加了一个else,我的本意是else和第一个if匹配,但是编译器不这么想,所以该加括号还是要加括号。#include#includeusing namespace std;int main(){ char s1[100],s2[100]; scan原创 2013-12-04 00:12:54 · 283 阅读 · 0 评论 -
NOIp2012 分解质因数
1、刚开始想到筛法求素数,但是数字太大,数组开不下,所以枚举。2、枚举的方向很重要,从小到大枚举就可以AC,但是从大到小枚举就会超时。#include#includeusing namespace std;bool is_prime(int n){ for(int i=2;i if(n%i==0) return false; return原创 2013-10-18 13:55:06 · 426 阅读 · 0 评论 -
NOIp2010 接水问题
1、学会了用Cena测评,还是很方便的。2、这题用贪心法,模拟可以做,但效率很低。3、刚开始sort的个数是n个,所以出错了,应该为m个,所以要小心! #include #include #include using namespace std;int main(){ freopen("water.in","r",stdin); freope原创 2013-10-18 09:45:24 · 595 阅读 · 0 评论 -
NOIp2012 寻宝
1、其实我已经做了优化(取模,把带楼梯房间加入队列),但是用Cena测评,最大的一组数据却要1.5s才能过(超过1s),刚在想我怎么越来越长出息了连普及组题目都过不了了,突然想到可能是因为文件太大了输入需要很长时间所以超时了,果不其然交到tyvj上就过了。2、这题就是约瑟夫问题的变形,注意取模的时候要特殊处理,因为“走的房间数”是从1开始编号的。比如说要走过5个带楼梯的房间,但这层楼一共就5个原创 2013-10-26 22:27:55 · 511 阅读 · 0 评论 -
NOIp2010 关押罪犯
1、本题用并查集做,将边从大到小排序,然后看两个端点是否在同一个集合中,如果在同一个集合就输出(贪心法),如果不在同一个集合,或至少有一个还没有分配,则他们两个分配到对立的监狱,注意后面应用find,而不是f[],因为a[i].y+n的集合可能已经在前几轮中被修改过。#include#includeusing namespace std;struct edge{ int原创 2013-10-22 09:14:06 · 484 阅读 · 0 评论 -
NOIp2010 三国游戏
1、这题很有意思,在一个博弈的背景下,考察贪心法。我通过分析隐约感觉到是求次大值,但是并没有分析出小涵是必胜的,所以没有得出“求次大值的最大值”算法。真希望这个是自己分析出来的,而不是靠别人的题解来理清思路的。所以说还是要多做一些博弈题,习惯习惯。#includeusing namespace std;int a[510][510];int main(){ freop原创 2013-10-21 18:42:02 · 400 阅读 · 0 评论 -
NOIp2010 乌龟棋
1、确实感觉自己的解题水平有很大提升。以前很怕dp,但是这个题一次AC了。其实找准状态就行,状态不是当前到的格子编号(太乱了,不好划分,而且卡片数很难维护),而是已使用的卡片数。用一个四维数组来记录当前最优值即可。#include#include#includeusing namespace std;int n,m,temp,answer,a[360],num[5],d[45]原创 2013-10-21 21:56:46 · 420 阅读 · 0 评论 -
NOIp2010 机器翻译
1、不会用STL,自己手工写了个循环队列。vis数组的运用可使查找的时间复杂度变成O(1)。#include#includeusing namespace std;int vis[1010],a[110];int main(){ freopen("translate.in","r",stdin); freopen("translate.ans","w",原创 2013-10-21 20:55:30 · 512 阅读 · 0 评论 -
NOIp2010 导弹拦截
1、本题很显然用贪心法,我的做法是,先比较某个导弹和哪个拦截点最近,然后导弹就归属于那个拦截点,求出两个拦截点各自能拦截到的最远的导弹,然后将这两个距离相加,测评后只得了40分。2、想出了一个反例。比如两个拦截点在一维数轴上,A在左,B在右,导弹1在A\B间距离A30米距离B31米的地方,导弹2在B右边,距离B40米的地方,按我的算法,答案是50的平方,实际上只是40的平方就可以了,也就是说,原创 2013-10-21 17:39:49 · 498 阅读 · 0 评论 -
NOIp2004 合唱队形
1、两次LIS问题,注意中间结点有重复,故要减去。2、悲催的是题目要求输出“最少几人出列”,我输出的是“最长序列是多少”,只得了20分。。。所以说要很仔细啊!#include#includeusing namespace std;const int INF=1000000000;int n;int a[110],d[110],e[110],g[110],h[110];原创 2013-12-02 21:09:20 · 286 阅读 · 0 评论 -
NOIp1998 多位数连接
1、昨天刚做过类似的题,不过这次的数据范围大了点,一次AC~#include#include#includeusing namespace std;int n;string num[100010];bool cmp(const string &a,const string &b){ return a+b>b+a;}int main(){ i原创 2013-12-02 21:26:44 · 347 阅读 · 0 评论 -
NOIp1999 拦截导弹
1、第一问求最长不上升子序列,第二问求最长上升子序列。为什么呢?假设两枚导弹a、b,a低b高,则要拦截两次,三枚导弹a,b,c,依次递增的话,则怎么样都得拦截三次,所以就是最长上升子序列。2、用了O(nlogn)的算法。注意lower_bound是返回大于等于给定元素的位置,upper_bound是返回大于给定元素的位置,如果要求小于的话,需要写cmp函数。#include#inclu原创 2013-12-02 17:19:02 · 514 阅读 · 0 评论 -
NOIp2005 谁拿了最多奖学金
1、记得以前做过这道题。。。当时A了一道水题就很开心很开心。。。有点感慨。。。#includeusing namespace std;struct s{ char name[30]; int num1,num2; char c1[2]; char c2[2]; int num3;}a[110];int score[110]={0};int mai原创 2014-01-29 21:06:42 · 316 阅读 · 0 评论