
刘汝佳
wrnge
这个作者很懒,什么都没留下…
展开
-
UVA-10003 Cutting Sticks(dp)
可以用记忆化搜索,也可以用递推。1.记忆化搜索,从[0,l]的状态推到基础状态,用时间很多(660ms)2.递推,从基础状态,长度慢慢增加,最后推到[0,l] 状态,相对节约时间(500ms)#include<bits/stdc++.h>#define INF 1<<30#define mxn 1005using namespace std;int d[mxn...原创 2019-02-07 19:09:16 · 129 阅读 · 0 评论 -
UVA-11093
从一号加油站开始,如果最多只能开到P号加油站,那么1,2,3…p号都不能作为起点。那么,从P+1号继续模拟。实现的时候,有两个细节需要注意。1.循环的时候 pos++; if(pos==n){ pos=0; }这两句必须在一起,不然会越界。2.pos是从temp开始,走到能走到的最后一个。如果pos<temp...原创 2019-01-27 15:41:07 · 154 阅读 · 0 评论 -
UVA-12627
一个简单的递归,注意边界条件以及开 LONG LONG !!!#include&lt;bits/stdc++.h&gt;using namespace std;typedef long long ll;ll func(ll k, ll i){ if(i==0) return 0; if(k==0) return 1; ll sum= (int)pow(...原创 2019-01-26 20:42:37 · 139 阅读 · 0 评论 -
UVA-10954
huffman编码的构建。用到了小顶堆的优先队列。(priority_queue(int , vector&lt;int ,greater&lt;int)#include&lt;bits/stdc++.h&gt;using namespace std;int main(void){ int n; while(scanf("%d",&amp;n)&amp;原创 2019-01-19 22:32:18 · 150 阅读 · 0 评论 -
UVA-714
这个题巧妙运用了二分然后逼近。首先确定min(S)的范围,然后再用二分逼近,最后的结果就是必然存在的那个最小值。另外,输出使用了贪心。而且这里的板是“后置板”,即先输出数,在输出板。位置i最多可以分成i+1块,而此刻的需求k是至少让剩余部分分成k-1块(因为如果在这里加一块的话,后面的部分会加一块)。如果i+1==k-1,即i+1<k的时候,就需要让后面的部分每一个单独的元素变成一块了。...原创 2019-01-19 22:14:34 · 255 阅读 · 0 评论 -
UVA-1471
这个题有点难以理解。。。。不是很懂,似懂非懂我只能写到init部分。#include<bits/stdc++.h>using namespace std;const int mxn=200000+5;int a[mxn],f[mxn],g[mxn],n;struct node{ int a,g; node (int a,int g):a(a),g(g){...原创 2019-01-19 18:12:27 · 168 阅读 · 0 评论 -
UVA-11572
第一种用set,比较简单易懂。第二种的map,相当于就是用map临时储存某个元素的上一个元素的位置,然后构造了一个last数组。根据last数组,只要last[i]<l,即在一个子序列中,右边的元素的上一个位置在L之外,就可以向右拓展。#include<bits/stdc++.h>using namespace std;//solution 1int main(voi...原创 2019-01-19 16:41:24 · 183 阅读 · 0 评论 -
UVA-1152
把a+b与c+d的结果储存到两个数组里面,再排序,“快排”一样从头到尾和从尾到头遍历。注意输出不要PE;#include<bits/stdc++.h>using namespace std;//-1 -1 1 1int main(void){ int n; cin>>n; while(n--){ int l; ...原创 2019-01-18 21:48:56 · 290 阅读 · 0 评论 -
刘汝佳第七章UVA-129
这里两个暴力法的点第一,递归暴力,默认之前的状态都是符合要求的,只需要讨论目前的状态(八皇后)第二,用return true 来达到“搜到就输出”的效果PE懒得改了#include<cstdio>using namespace std;int n,l;int ans[1000]={0};int ct=0;bool dfs(int cur){//cur没填,ct为之前...原创 2019-01-02 13:54:52 · 150 阅读 · 0 评论 -
C++ 快排以及第k+1小的元素
还要加深对快排的理解吖。#include&amp;lt;cstdio&amp;gt;using namespace std;void qc(int *a,int left,int right){ if(left&amp;gt;=right) return; int fir=left,las=right,key=a[left]; while(fir&amp;lt;las){ whil...原创 2019-01-06 00:10:41 · 183 阅读 · 0 评论 -
UVA-524
DFS水题,注意回溯,以及最后一位的判断有两个方向#include&lt;cstdio&gt;#include&lt;cstring&gt;using namespace std;int ans[20]={0};bool prime[40]={false},use[18]={false};void dfs(int pos,int n){//pos没填 if(pos==n){...原创 2019-01-01 17:56:41 · 145 阅读 · 0 评论 -
UVA-1608
用一个prevv数组和nextt数组分别表示i位置上一个相同元素的位置和下一个相同元素的位置。然后先找到只出现一次的元素,标记其位置为p,则继续判断[0,p-1]与[p+1,n-1]…是一个递归。其中,有两处时间必须优化。第一,这里的元素最大可能为10e9,则用一个last数组来表示某个值上一次出现的位置会对空间有很大的要求。所以这里用一个MAP,节约了空间,时间只从O(1)便成了O(logn...原创 2019-01-28 16:34:37 · 298 阅读 · 0 评论 -
UVA-1609
这个题就是纯构造,一旦找到“黑队”和“白队”的概念,就有一定的思路了。后面就是构造四个阶段。每一个阶段的原则就是尽量让白队打黑队,然后让黑队内部打,最后随机分配。#include<bits/stdc++.h>using namespace std;const int maxn = 1024+5;char table[maxn][maxn];int main(void){...原创 2019-01-28 17:18:35 · 233 阅读 · 0 评论 -
UVA-11584 Partitioning by Palindromes (dp)
状态:d[i]表示前i个字符所组成的最少回文串。状态转移:d[i]=min(d[j]|s[j+1:i]是回文串)#include<bits/stdc++.h>#define INF 1<<30using namespace std;char s[1005];int d[1005];bool check(int l,int r){ while(l<r...原创 2019-02-07 16:31:51 · 149 阅读 · 0 评论 -
UVA-11400
用了构造函数再用结构体数组就会报错!。。。#include<iostream>#include<algorithm>using namespace std;const int maxn = 1000 + 5;struct Lamp { int v, k, c, l; bool operator < (const Lamp& rhs) co...原创 2019-02-07 14:00:55 · 214 阅读 · 0 评论 -
UVA-12563 Jin Ge Jin Qu hao(DP;01背包:两个条件最优化)
稍微转换一下就是01背包问题。值得注意的是,这里要先保证唱的歌数最多,其次是唱的时间越长。我在这里用了分情况讨论:1.不唱这首歌,总歌数多一点,则不唱这首歌 if(dp[t][0]>dp[t-ge][0]+1){ continue; }2.唱这首歌,不唱这首...原创 2019-02-06 23:27:29 · 165 阅读 · 0 评论 -
UVA-1610
这个题感觉好绕,最后绕出来了,发现uDebug里面的也有错??直接暴力求解法就出来了,不用比较啥的。如果用注释掉的“比较法”代码,估计错就错在是’A’到’Z’的序列,如果超过Z还要长度加一的。#include<bits/stdc++.h>using namespace std;int main(void){ int n; while(scanf("%d",&...原创 2019-01-29 21:33:15 · 168 阅读 · 0 评论 -
UVA-1149
先sort,再左右两端指针判断,注意退出条件为l>r。如果l==r,还要加一个。#include<bits/stdc++.h>using namespace std;int main(void){ int t; cin>>t; while(t--){ int n,len; cin>>n>...原创 2019-01-29 20:15:52 · 109 阅读 · 0 评论 -
UVA-437 The Tower of Babylon (DAG上的DP)
用一个3*n的数组保存N个立方体的3个状态,然后建图,注意建图的时候是底的短边与上的短边比,底的长边与上的长边比。然后开始dp,总的来说,dp的步骤1.记忆化搜索,看d[i]是否被计算过,如果被计算过,直接返回这个值。(用vis[i]来办)2.d[i]没有被计算过,则先置vis[i]=1,然后通过邻接矩阵来更新这个值。#include<bits/stdc++.h>using ...原创 2019-02-05 22:18:15 · 135 阅读 · 0 评论 -
UVA-1025 A Spy In the Metro (dp)
这个题好像是“填表法”每个状态都是由:左边火车开来,右边火车开来,等候,这三种状态转移而来,所以只需要比较这三个状态转移而来的最小值。需要注意的是状态转移的方向,以及判断不越界条件的顺序(下标一般在前面)。#include<bits/stdc++.h>#define INF 0x6FFFFFFF#define mxn 500using namespace std;int d...原创 2019-02-05 18:49:55 · 145 阅读 · 0 评论 -
UVA-11491(贪心)
这个题一开始从“需要多少个数字”来考虑了,想从数字本身的大小来考虑。但是数字位数也是很重要的一个标准,所以这样必WA。正确的方法,还是要从左边扫到右边。比较答案的最后一个与输入的下一个,如果输入的下一个比较大,那么将原答案的划掉。如果输入的下一个比较小,那么输入下一个。如果最后答案长度长于需要长度,说明d>0,继续将末尾的划掉即可。#include<bits/stdc++.h>...原创 2019-02-04 00:00:28 · 314 阅读 · 0 评论 -
UVA-1442
要想到连同器原理:此地图上某一点的最大高度,为min(左边最大高度,右边最大高度,这一点的天花板),然后根据这个原理,分别以左边最大高度和右边最大高度扫描两次,最后取一次min#include<bits/stdc++.h>using namespace std;int main(void){ int t; cin>>t; while(t--)...原创 2019-01-28 17:40:26 · 204 阅读 · 0 评论 -
UVA-12545
这个题先考虑‘0‘优先还是’1‘优先,因为这里0可以变成1,但是1不可以变成0,所以应该是0优先,即S串上的?如果对应T串上的0,则优先变成0.第二步,再考虑外面的01交换。如果交换过后,S串?区外对应需求0比较多,那么还没变成1的?就要先变成0,再交换,直到?区外面的S串与T串一样。如果?区外对应需求1比较多,那么只需要外面的0自己变成1,?区内变成对应的数字就行了。#include<...原创 2019-02-02 23:53:03 · 120 阅读 · 0 评论 -
刘汝佳第七章UVA-10603
1.这个题要求的是输出最小水量。BFS的队列实现就是用一个量来衡量两个状态的先后顺序,然后根据这个先后顺序来决定先遍历哪个状态。在这里,需要定义一个dist来代表到这个状态的最小水量,然后重载运算符,最小水量越少,这个状态优先级越高。如果定义步数,则会找到最小步数,这个是BFS的特点决定的。即,BFS能找到目标状态的某一个最小量。如果状态用结构体表示的话,这个最小量可以用一个函数重载来定义。2...原创 2019-01-05 00:25:27 · 191 阅读 · 0 评论 -
刘汝佳第六章UVA439
一开始不知道怎么表示计数器,是因为对bfs函数没有很深的理解。常用的bfs板子是内部定义一个队列,然后对队列进行操作而这里的bfs函数是执行一个判断+入列的操作,本身不接受参数,也不返回任何值。这两种办法本质是一样的,所以次数的统计必须要内置到队列的每一个元素中去。我这里是用百位表示次数,十位和个位表示位置(因为小于99)。这个方法有点取巧,但是不是一般的方法。另一个方面是输入输出。用s...原创 2018-12-18 14:18:23 · 151 阅读 · 0 评论 -
刘汝佳第六章UVA-536
输入先序遍历和中序遍历,输出后序遍历。易错点:1.在build函数里面没有判断left>right的条件2.递归区间的选择。优化点:1.直接在每个build函数里面输出root,因为后序遍历,是先输出左边,在输出右边,在输出结点。所以利用这个特性,build函数做成“先建左边的树,再建右边的树,再打印出自身”。用left>right来判断非法,其他的不用管。#include&...原创 2018-12-18 00:05:39 · 160 阅读 · 0 评论 -
刘汝佳第六章 UVA-11988
用数组实现链表。s[i]来代表节点,next[i]代表s[i]指向下一个的指针。用一个cur来指向目前操作的节点。同时这样做,还要用last来表示最后一个节点(END)功能使用。受益匪浅由于0是next[0],则最后接地的节点就是0。所以会使用i!=0来判断是否已经到地。#include<cstdio>#include<cstring>using namespac...原创 2018-11-19 23:25:19 · 129 阅读 · 0 评论 -
刘汝佳第六章UVA-122
用结构体实现了不完全二叉树用到了不熟悉的构造函数多个模块分开写成函数用了几个str的操作队列实现BFS,vectro储存结果注意输出not complete 的情况,要考虑周全,然后用一个failed来判断。用数组来表示这种数据结构也行。#include<cstdio>#include<vector>#include<queue>#inc...原创 2018-11-21 11:31:34 · 241 阅读 · 1 评论 -
刘汝佳第六章UVA-679
第一道二叉树的题。给定一棵包含2^个结点的完全二叉树,如果把结点从上到下从左到右编号,则节点k的左右子节点编号分别为2k和2k+1。对于这个题,第I个落到某个节点的球,如果I为奇数,则它是第(I+1)/2个落在左子节点的球。如果I为偶数,则它是第I/2个落在右子节点的球。#include<cstdio>using namespace std;int main(void)...原创 2018-11-21 09:42:43 · 150 阅读 · 0 评论 -
刘汝佳第六章UVA-12657(有误
这道题还是用上道题的方法,有方向数组储存方向,有值数组储存值。这道题要用双向链表,所以用left和right来写。但是目前还没有写完,翻转链表和交换还有bug。bug的问题出在两个头结点在操作后可能会丢失链接。以后再来debug叭#include<cstdio>#include<cstring>using namespace std;int num[100005]=...原创 2018-11-20 22:30:26 · 143 阅读 · 0 评论 -
刘汝佳第五章UVA-230
这道题对于不熟悉基本操作(尤其是string)的我来说,实在是太难了。先总结一下基本操作结构体内重构操作符 bool operater…… 可以让结构体可以比较大小。string.find(a,num) 是从string的第Num开始找a,并且返回a的位置,如果找不到,则返回string::nopsstring.substr(a,b)取[a,b)的子字符串(也为string)map加...原创 2018-11-08 23:35:06 · 105 阅读 · 0 评论 -
刘汝佳第五章 UVA-12100
先上正确做法。正确做法是用两个队列。一个队列模拟真实队列,一个优先队列来判断是否出列。这里输出没有记录完成任务过程中的耗时,相反,直接判断当任务完成时,总任务数减去目前任务数加一,即为耗时这里使用cin,cout的输入输出。不知道后面是否有优劣之分。在每一个循环重新声明队列,不然会发生混乱。和之前的错误类似。不要吝惜小空间,使用同一个变量容易发生混乱。#include<bits...原创 2018-11-08 18:54:18 · 168 阅读 · 0 评论 -
刘汝佳第五章 UVA1594
完全水题。。。用两个数组交叉赋值就可以了。循环超过1000次(据说超过200次)就可以判断为LOOP#include&lt;bits/stdc++.h&gt;using namespace std;int abs(int a ,int b){ return a&gt;b?a-b:b-a;}int main(){ int T; scanf("%d",&amp;...原创 2018-11-05 23:56:22 · 123 阅读 · 0 评论 -
刘汝佳第五章 UVA-514
这道题就是一个逆向思维。。。每一个需求队列是否可以满足123…n输出。用一个栈可以很轻松的实现。需要注意的是,空栈调用s.top()会出问题??所以每次先判断是否empty,空的话就先push进去。#include<bits/stdc++.h>using namespace std;int main(void){ int n; while(scanf("%d"...原创 2018-11-10 23:57:01 · 143 阅读 · 0 评论 -
刘汝佳第五章UVA-1595
我的想法是比较相同y值的所有点的平均值但是还有更加简单的想法,即若两点满足1.x轴的和为对称轴的2倍 2. y轴相等, 那么这两个点对称,然后再直接认为x最小+x最大的两倍就是对称轴的两倍。我的想法#include<bits/stdc++.h>using namespace std;int main(void){ int T; scanf("%d",&am...原创 2018-11-07 10:54:55 · 107 阅读 · 0 评论 -
刘汝佳第五章 UVA-10391
这个题,学习了很多关于迭代器和STRING的知识。。。对于集合set创建迭代器用格式 set::iterator it; 目前不是很清楚双冒号什么用。set.find()函数,如果找到,返回此处的迭代器,如果找不到,返回set.endset.insert(x),在集合中插入x对于string流式输入cin>>stringstring.c_str 返回一个处理后的临时...原创 2018-11-07 10:07:44 · 169 阅读 · 0 评论 -
刘汝佳第六章UVA-548
递归遍历树还是有点绕。现在看来是这样1.先序遍历的结果,第一个为节点,然后一坨是PreOrder(left[root])的结果,右边是PreOrder(right[root])的结果2.中序遍历,同理,节点在中间。3.后序遍历,同理,节点在最后在这道题中,因为要区分节点,所以每个节点权值不一样,所以可以用节点的权值来唯一表征节点。总的来说:1.用数组实现了树,left[root]是roo...原创 2018-11-28 23:47:20 · 155 阅读 · 0 评论 -
刘汝佳第六章UVA-839
递归输入,那么就沿着这个的思路,一边读入一边判断。这里使用了引用传值,所以说代码十分精简。对于这个int solve(int & w )函数,有两个作用1.返回一个bool值,代表是否平衡。2.传引用修改w,使传入的值被修改为子天平的总重量,就是这个天平的重量。这个题主要是递归#include<iostream>#include<cstdio>usin...原创 2018-12-02 12:20:59 · 139 阅读 · 0 评论 -
刘汝佳第六章UVA-1600(RE)
BFS最短路,注意剪枝死活RE,留坑#include<cstdio>#include<cstring>#include<queue>using namespace std;int dir[8]={0,-1,-1,0,0,1,1,0};struct pos{ int row; int col; int t; int c...原创 2018-12-21 18:00:15 · 175 阅读 · 0 评论 -
HDU-1455 DFS+回溯+剪枝
先从1开始遍历可能最小长度dfs(int ct,int len,int pos) ct代表目前有的棍子总数,len代表目前这根棍子的长度,pos代表可以开始寻找棍子的位置。矛盾主要在每一根子棍子的长度上。如果这个子棍子的长度不合理,那么要剪除所有这个长度的棍子的枝。这里有三个剪枝条件。#include<cstdio>#include<algorithm>#incl...原创 2018-12-15 17:26:52 · 156 阅读 · 0 评论