题解+注释
文章平均质量分 61
niuyuxinf4
这个作者很懒,什么都没留下…
展开
-
OJ-P1317【乌龟棋】
经典DP。知名度不再多说。其实学了DP应该就会过这题。蒟蒻的我自认思维的障碍在于四维的数组+循环。#include#include#include#include#include#includeusing namespace std;int n,m,map[370],F[51][51][51][51];int i1=0,j11=0,k1=0,l1=0;void init(){ cin>>n>>m;原创 2014-06-26 12:34:53 · 125 阅读 · 0 评论 -
OJ-1915【USACO·Gold电视游戏】
经典依赖型背包模型的略复杂版。主要难点: 1.对数据的组织和存储格式; 2.以及当主件不算价值的时候,临时状态数组a与状态数组F之间的迭代关系要搞清楚。其他的没有什么了,但在这道题调试的过程自感对依赖背包的理解程度上了一小步。(哎很好)。粘出Code+注释:#include#include#include#include#include#include#includeusing namespace原创 2014-06-26 12:34:39 · 97 阅读 · 0 评论 -
OJ-1278【金明的预算方案】 依赖型背包
经典背包类问题,当分的组中有一个作主件(只有装了主件才能装该组物件的其他物件)时,DP的思路就必须更加更加的清晰与结构化,明白每一步都做了什么。要不就像我开始一样Orz了。注释版Code:#include#include#include#include#include#include#includeusing namespace std;int n,m,F[40010],a[400原创 2014-06-26 12:34:37 · 86 阅读 · 0 评论 -
OJ-1274【逃亡的准备】 DP多重背包练习
算是个模板题吧,多重背包的DP+二进制优化关于多重背包: 1.如果一种物件的数量足够多(多到背包放不下),那么对于该物件就是做一遍完全背包; 2.否则的话便可以对该物件的每一个做一遍01背包(!)。 这里的二进制优化:(将该物件按件数用两个变量将其拆成若干个2的n次幂的形式,这样将O(n*n)变为了O(n*log2n))Code+注释:#include#include#include#inclu原创 2014-06-26 12:34:34 · 337 阅读 · 0 评论 -
OJ P1106 【Noip2008】立体图
题面就不粘了,就是一个画出数学上立体图模型的题。题属于思想简单(纯模拟+迭代(一个一个竖着摆时要用)),实现有些麻烦。中间实现的时候出现的不足之处:1.首先是打表,还是不怎么习惯于将每一步处理的结果全都输出出来然后一一对比着看,但这次是真感到这么做的好处了。顿觉Ctrl+F10什么的都弱爆了。。下次要记住2 步骤: 步骤不清晰是模拟题最忌讳的。这次还行,但还是今后要高度注意。。。(我真不想重写)。原创 2014-06-26 12:34:18 · 128 阅读 · 0 评论 -
OJ P1222 Watering Hole
#include#include#include#include#includeusing namespace std;int dis[320];bool vis[320];int sumn=0,c;int a[310][310];int v=1,v1;int n;void init(){ cin>>n; memset(a,10,sizeof(a)); a[0][0]=0; for(int i=1原创 2014-06-26 12:33:09 · 86 阅读 · 0 评论 -
Oj P1216 虫洞
#include#include#include#include#includeusing namespace std;int f,n,m,w;bool rel;struct len{ int xx,yy,vv;}a[25500];//开边集数组记录每条边起点终点权值;int ti=1;void read(){ cin>>n>>m>>w; for(int i=1;i { cin>>a[i].x原创 2014-06-26 12:32:51 · 137 阅读 · 0 评论 -
近似排序
#includeusing namespace std;int aa,b; int a[120][2]={0};int reverse(int i){ int sumb=i; int sum=0; while(sumb>0) { sum=sum*10+sumb%10; sumb=sumb/10; }return sum;}void nsqrt(){ for(int i=1;i for(原创 2014-06-26 12:32:24 · 877 阅读 · 0 评论 -
OJ-P1187【虫食算】
首先说一下,写完这道题我感觉整个人都斯巴达了。。 很经典的题目,网上随便搜都能搜到题目描述,就不过多阐述了。 说下心得:这道题一共算交了9遍,(九为数之极么。。)大概分为四个阶段: 1.首先是30的暴搜,本想着大体写好后再加剪枝的,结果越改越乱。这充分证明了我DFS思路的不清晰; 2.然后听老师意见发现最大的问题在于没有搜索策略,于是开始重敲,从最低位开始每层枚举两个数(两个加数的第k位)原创 2014-06-26 12:35:07 · 124 阅读 · 0 评论 -
OJ-P1209【几何图形还原】
一道图论的题,但其实感觉只是用了一个邻接矩阵存边用来判断DFS,剩下的就只是一边DFS找方案了。可是有个细节:如果DFS只到第n层,那么还需判断第n个点与第1个点是否有边(有些小坑。。。)Code+注释:#include#include#include#include#include#include#includeusing namespace std;bool mapp[41][41],poin原创 2014-06-26 12:34:55 · 163 阅读 · 0 评论 -
Oj P1214 Bessie Come Home
#include#includeusing namespace std;int aa[150][150]={0};//邻接矩阵,用大小写字母的ASC||码表中序号作下标;int p,xx;int cc,hh;char ch1,ch2;void read()//读入过程{ cin>>p; for(int i=1;i { char ch1,ch2; int p,xx; cin>>ch1;原创 2014-06-26 12:32:41 · 128 阅读 · 0 评论 -
OJ P1119 传球游戏(递推)
#include#include#include#include#includeusing namespace std;long long f[120][120];int n,m;int main(){ cin>>n>>m; memset(f,0,sizeof(f)); f[0][1]=1; for(int i=1;i for(int j=1;j原创 2014-06-26 12:33:26 · 160 阅读 · 0 评论 -
OJ-P1269【马棚】
好吧,突然发现快想不起来这题该怎么做了。。只能说熟练度还不够。。Orz(这是我打的最多的一个表情么)一道典型的资源分配类DP,做法: 枚举前i匹马和前k个马棚,转移的状态F[i][k]为(前i-j匹马放入前k-1个马棚加上第i-j+1匹马到第i匹马放入第k个马棚)的最小矛盾值。 数据比较正常的(0,500],输入格式也不纠结,So,理清思路后一遍DP,输出F[n][k]就很欢乐的A了。Code+注原创 2014-06-26 12:34:50 · 96 阅读 · 0 评论 -
OJ P1161 亲和数
#include#include#include#include#include#include#includeusing namespace std;int A,B;long long shuzhi;long long a[500];//保存找过或间接找过的数int summ=0;long long dear(int n)//算n的亲和数{ shuzhi=1; for(int i=2;i原创 2014-06-26 12:33:43 · 151 阅读 · 0 评论 -
OJ P1699 亲戚(*并查集模板啊有木有)
#include#include#include#include#includeusing namespace std;int f[10010];int n,m,p;int getfather(int v){ if (f[v]==v) return v; f[v]=getfather(f[v]); return f[v];}void merge(int x,int y){ int fx,fy;原创 2014-06-26 12:33:07 · 102 阅读 · 0 评论 -
Oj P1060 字符数组(囧)
这是道神奇的水题。。唉。。。水题不加注释:只不过一定要学习getline用法。#include#include#include#include#includeusing namespace std;int main(){ string a;int a1,b1; int n,k,t;char ch,cj; scanf("%d %d %d\n",&n,&k,&t); getline(cin,a);原创 2014-06-26 12:32:53 · 78 阅读 · 0 评论 -
连乘取余
#includeusing namespace std;int main(){ long long x,y; cin>>x>>y; int y1=1,ys=2011; for(int i=1;i y1=y1*10; for(int i=2;i ys=ys*2011; ys=ys%y1; coutreturn 0;}输入格式 Input Format 两个整数x和y。 输出格式原创 2014-06-26 12:32:22 · 493 阅读 · 0 评论 -
OJ-P1802【种树】
RQNOJ上曾经见过一道类似的题【教主的花园】,所以现在学习DP再看这题更是“仇人相见分外眼红”。这道题就算开始学了DP也困惑了不少有痣青年(比如蒟蒻的本人),我对DP简约但富有内涵的印象完全被颠覆了,原来DP也可以这么复杂。好吧,蒟蒻的我。思路: 比较好想到,但像我这样的zhazi却不太敢轻易的去写,虽然想法是对的但过程早已清新脱俗的超出一个初学者的逻辑……好吧不扯了。。。真~思路: 因为是环,原创 2014-06-26 12:34:48 · 128 阅读 · 0 评论 -
OJ-P1950【流星雨】
描述 Description 贝茜听说了一个骇人听闻的消息:一场流星雨即将袭击整个农场,由于流星体积过大,它们无法在撞击到地面前燃烧殆尽,届时将会对它撞到的一切东西造成毁灭性的打击。很自然地,贝茜开始担心自己的安全问题。以FJ牧场中最聪明的奶牛的名誉起誓,她一定要在被流星砸到前,到达一个安全的地方(也就是说,一块不会被任何流星砸到的土地)。如果将牧场放入一个直角坐标系中,贝茜现在的位置是原点,原创 2014-06-26 12:34:41 · 249 阅读 · 0 评论 -
OJ P1361噩梦
这题是KMP算法模板。先总结下KMP:对于a,b两个字符串,如何用O(n)的时间求出b是否是a的字串:对比着看:一般算法 O(m*n): 对a有指针i,对b有指针j。i不断自增的同时不断使a【i..i+j】与b比较。传说中的KMP: 首先应先预处理出p数组记录当指针为j时p【j】记录b串中前j个字符中<b style="ms原创 2014-06-26 12:34:04 · 119 阅读 · 0 评论 -
OJ P1109 字符串展开
#include#include#include#include#include#include#includeusing namespace std;int p1,p2,p3;bool q=0;//用于标记‘-’号两边字符不符合处理要求的情况string str,ww;//str为读入的待处理字符串,ww记录每次处理(展开)的结果;void init(){ cin>>p1>>p2>>p3; ci原创 2014-06-26 12:33:50 · 158 阅读 · 0 评论 -
OJ P1114 拍卖 (递推)
#include#include#include#include#includeusing namespace std;int f[1000086];int w,p,a,b,ans;int main(){ cin>>w>>p>>a>>b; ans=0; memset(f,0,sizeof(f)); f[p]=1; for(int i=p+1;i原创 2014-06-26 12:33:22 · 90 阅读 · 0 评论 -
OJ-P1267【尼克的任务】
学习DP线性时候的一道练习题,蒟蒻的我当时完全想不到要倒着转移状态。。Orz了,哎~Code+注释:#include#include#include#include#includeusing namespace std;int n,k,F[11000];struct da{ int start,timee;}map[11000];//记录void init(){ cin>>n>>k; for (i原创 2014-06-26 12:34:46 · 90 阅读 · 0 评论 -
OJ-P1259【饥饿的奶牛】
初学DP一段时间了,开始回顾写总结去~现在看来,这是一道比较经典的线性DP,重点是对线段区间的处理,存储和DP时的细节。思路: 1:预处理将每一个需求的区间只记录两个端点并以左端点升序排列; 2:DP过程。 用在前i-1个区间中可以加上第i个区间的最大值作为F[i]的值并记录结束点坐标向后转移; 3:没了,输出F[n]最大值;粘下Code+注释:#include#include#include#原创 2014-06-26 12:34:44 · 102 阅读 · 0 评论 -
OJ-P1234【校园网络】
描述 Description 一些学校连入一个电脑网络。那些学校已订立了协议:每个学校都会给其它的一些学校分发软件(称作“接受学校”)。注意如果 B 在 A 学校的分发列表中,那么 A 不必也在 B 学校的列表中。你要写一个程序计算,根据协议,为了让网络中所有的学校都用上新软件,必须接受新软件副本的最少学校数目(子任务 A)。更进一步,我们想要确定通过给任意一个学校发送新软件,这个软件就会分发到网原创 2014-06-26 12:35:15 · 193 阅读 · 0 评论 -
OJ-P1211【街道赛跑】
又开始学习图论了。希望这次不会再理解的那么费劲了。。。。 描述 Description 图一表示一次街道赛跑的跑道。可以看出有一些路口(用 0 到 N 的整数标号),和连接这些路口的箭头。路口 0 是跑道的起点,路口 N 是跑道的终点。箭头表示单行道。运动员们可以顺着街道从一个路口移动到另一个路口(只能按照箭头所指的方向)。当运动员处于路口位置时,他可以选择任意一条由这个路口引出的街道。图一:有原创 2014-06-26 12:35:12 · 135 阅读 · 0 评论 -
P1265【花店橱窗】
描述 Description 假设你想以最美观的方式布置花店的橱窗。现在你有F束不同品种的花束,同时你也有至少同样数量的花瓶被按顺序摆成一行。这些花瓶的位置固定于架子上,并从1至V顺序编号,V是花瓶的数目,从左至右排列,则最左边的是花瓶1,最右边的是花瓶V。花束可以移动,并且每束花用1至F间的整数唯一标识。标识花束的整数决定了花束在花瓶中的顺序,如果I<J,则令花束I必须放在花束J左边的花瓶中。原创 2014-06-26 12:34:30 · 80 阅读 · 0 评论 -
模板——高精度减法
#include#include#include#include#include#include#include#include#include#includeusing namespace std;string s1,s2;struct bignum{ int len; int num[300];}a,b,c;void strtobig(string s,bignum &p){ reverse(原创 2014-06-26 12:33:33 · 54 阅读 · 0 评论 -
第一篇程序(集)
#includeusing namespace std;int main(){ int a,b; cin>>a>>b; a=a+b; cout system("pause"); return 0;}A+B---------------------------------------------#include using namespace std; int power(int a,int原创 2014-06-26 12:32:17 · 80 阅读 · 0 评论 -
OJ P1175 zero num
这题敲了一天。终于算大体明白了。感觉对搜索算是又加深了一层理解。但那个层数感觉稍微清晰些理解。。唉。。Orz。继续练吧。多想想。code+注释:#include#include#include#include#include#include#include#includeusing namespace std;int n;char ways[21];//dfs搜索记录每两个数间符号ch原创 2014-06-26 12:34:02 · 144 阅读 · 0 评论 -
OJ P1178 最佳调度
这题交了6遍。。。想法:首先想到了是贪心。但很多反例。然后准备用搜索,但这次搜索需要剪枝,所以还得保留贪心得到的较优解,使得凡比较优解还大的解直接pass掉,这样就很能节省时间了。#include#include#include#include#include#include#includeusing namespace std;int n,k;int an[71],ak[71];//an存每个工原创 2014-06-26 12:33:59 · 241 阅读 · 0 评论 -
OJ P1200 【noip2009 普及】细胞问题
#include#include#include#include#include#include#include#includeusing namespace std;int m1[10000],m2[10000],a1[10000],a2[10000];int n;int mm1,mm2;int ans=-1;int k=0,kk=0;int main(){ cin>>n; cin>>mm1>原创 2014-06-26 12:33:52 · 101 阅读 · 0 评论 -
模板——高精度加法
#include#include#include#include#include#includeusing namespace std;struct bignum{ int len; int num[300];}a,b,c;void strtobig(string s,bignum &p)//把读入的字符串存入定制好的高精度类型{ reverse(s.begin(),s.end()); //字原创 2014-06-26 12:33:31 · 82 阅读 · 0 评论 -
OJ P1205 田地上的环(邻接矩阵/DFS)
“佛洛依德”(音译)。?Code:#include#include#includeusing namespace std;const int maxn=300;//据题目要求最大250*250,多开到300;bool mapp[maxn][maxn]={false};//建立邻接矩阵,赋初值为假;bool aaa[256]={0};//再建立一个布尔数组存储每个点与点【1】的连通关系;in原创 2014-06-26 12:32:34 · 112 阅读 · 0 评论 -
Oj P1206 犯罪团伙。(邻接表)
#include#includeusing namespace std;const int maxn=10100;const int maxm=50100;int col=0;struct edge{ int y,next;//y值记录链表中数据,next记录下位位置}e[maxm*2];int linkk[maxn];//表头int n,m,t=0;int color[maxn]={};void原创 2014-06-26 12:32:36 · 289 阅读 · 1 评论 -
P1266【拔河比赛】
描述 Description 一个学校举行拔河比赛,所有的人被分成了两组,每个人必须(且只能够)在其中的一组,要求两个组的人数相差不能超过1,且两个组内的所有人体重加起来尽可能地接近。输入格式 Input Format 输入数据的第1行是一个n,表示参加拔河比赛的总人数,n输出格式 Output Format 输出数据应该包含两个整数:分别是两个组的所有人的体重和,用一个空格隔开。注意如果这两个数原创 2014-06-26 12:34:32 · 227 阅读 · 0 评论 -
OJ P1085 方块转换
#include#include#include#include#include#include#include#include#include#includeusing namespace std;int n;struct dchar{ char in[12][12];}astart,a90,a180,a270,aa,aend,aa90,aa180,aa270;void init(){原创 2014-06-26 12:33:38 · 240 阅读 · 0 评论 -
模板——高精度乘法
#include#include#include#include#include#include#include#include#include#includeusing namespace std;string s1,s2;struct bignum{ int len; int num[300];}a,b,c;void strtobig(string s,bignum &p)//字符串转化高精度原创 2014-06-26 12:33:36 · 98 阅读 · 0 评论 -
OJ P1115 集合划分 (递归)
#include#include#include#include#includeusing namespace std;int n,m;unsigned long f(int n,int m){ if((n==0)||(n==m)||(n==1)||(m==1)) return 1; if (n return f(n-1,m-1)+m*f(n-1,m);//原创 2014-06-26 12:33:24 · 168 阅读 · 0 评论 -
OJ P1083 龙舟(字符串处理)
#include#include#include#include#include#include#includeusing namespace std; int r,c;struct zz{ int xh,jl,pm;}aa[10];char a[52];void init(){ cin>>r>>c; for(int i=1;i { for(int j=1;原创 2014-06-26 12:33:17 · 205 阅读 · 0 评论