51nod
cysjiang
这个作者很懒,什么都没留下…
展开
-
51nod1268和为K的组合(枚举)
给你N个数,一共有2^n种可能,从1枚举到1<#include<iostream>using namespace std;int main(){ int a[100]; int n, k, s; cin >> n >> k; for(int i = 1; i <= n; i++){ cin >> a[i]; } int i;原创 2017-04-03 18:48:34 · 281 阅读 · 0 评论 -
51nod 1153 选择子序列 (好题)
这个题很不错。 采用贪心的思想:首先考虑到在整个序列中取最大值一定是最优的,也就是说B数组的第一个数是A数组的中最大值的下标。而且通过题意我们发现,一旦选定了某个数就把当前的区间划分成两份。比如说第一次选了9,第二次选了10, 那么下一次肯定不会选8(这几个数字说的都是下标),不会垮区间选数,那么我们就可以每次选一个区间最大值,再把区间划分成两份分别查找最大值就可以了。因为每个元素最多访问一遍,再原创 2017-07-30 11:20:01 · 509 阅读 · 0 评论 -
1293 球与切换器
很明显从右下角的盒子下面出去的球的个数只与最后一列最下面那个切换器有关。我们可以把每一个切换器看作一个节点。每个节点向它的子节点输送它自身一半的球(如果是奇数个要判断哪个子节点得到的更多)。遍历一遍就能得到结果 遍历是n^2的,所以我们需要o(1) 找它的父节点,否则会超时。 具体看代码吧#include<stdio.h>using namespace std;typedef long lon原创 2017-08-07 19:12:17 · 259 阅读 · 0 评论 -
51nod1420 数袋鼠好有趣
排序后二分#include<cstdio>#include<algorithm>#include<queue>using namespace std;const int maxn = 1e6 + 50;int a[maxn];int s = 0;int maxi = 0;int n;int judge(int k){ for(int i = 1, j = k + 1; i <=原创 2017-08-04 16:14:32 · 239 阅读 · 0 评论 -
51nod1076 2条不相交的路径
在环路上的两点一定可以,否则就不行。 用tarjan算法就可以解决#include<cstdio>#include<vector>#include<algorithm>#include<stack>using namespace std;const int maxn = 50500;vector<int> a[maxn];int dfn[maxn];int low[maxn];in原创 2017-08-04 15:10:43 · 250 阅读 · 0 评论 -
51nod1288 汽油补给
这不是就noip旅行家的预算吗。只不过这个每公里消耗一升油,感觉更简单了些。 贪心,每次找一个点后面第一油价比它低的点,想办法到那里让油全部用完。找它后面第一个比它价格低的点可以用单调栈处理。#include<stdio.h>#include<stack>#include<iostream>using namespace std;typedef unsigned long long ll;原创 2017-08-12 13:05:34 · 390 阅读 · 0 评论 -
51nod 1060 最复杂的数
1060 最复杂的数题目来源: Ural 1748基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注把一个数的约数个数定义为该数的复杂程度,给出一个n,求1-n中复杂程度最高的那个数。例如:12的约数为:1 2 3 4 6 12,共6个数,所以12的复杂程度是6。如果有多个数复杂原创 2017-07-28 19:40:00 · 255 阅读 · 0 评论 -
51nod 1051 最大子矩阵和
动态规划修改 隐藏话题1051 最大子矩阵和基准时间限制:2 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注一个M*N的矩阵,找到此矩阵的一个子矩阵,并且这个子矩阵的元素的和是最大的,输出这个最大的值。例如:3*3的矩阵:-1 3 -12 -1 3原创 2017-07-28 19:32:48 · 264 阅读 · 0 评论 -
51nod 1070 Bash游戏 V4
博弈论修改 隐藏话题1070 Bash游戏 V4基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 收藏 关注有一堆石子共有N个。A B两个人轮流拿,A先拿。每次拿的数量最少1个,最多不超过对手上一次拿的数量的2倍(A第1次拿时要求不能全拿走)。拿到最后1颗石子的人获胜。原创 2017-07-28 20:28:16 · 253 阅读 · 0 评论 -
51nod 1205 流水线调度
这个题排个序就好了。就是如果A排在B前面更优就把A放在前面,否则把B放在前面#include<cstdio>#include<algorithm>using namespace std;const int maxn = 1e5;struct p{ int a, b;}a[maxn];int cmp(p a, p b){ return a.a + max(a.b, b.a) +原创 2017-07-31 16:21:35 · 369 阅读 · 0 评论 -
51nod 1179 最大的最大公约数
这个题也很棒的。虽然最后发现只是个枚举的题目,但是判定的方式很棒,有点像多校那天的容斥。 思路就是从大到小枚举一个数,判定这个数是不是两个数的最大公约数。 判定的时候只枚举这个数的倍数,所以是logn的复杂度吧。再加上枚举是nlogn的#include<cstdio>#include<map>using namespace std;const int maxn = 1e5;map<int,原创 2017-07-31 15:02:18 · 237 阅读 · 0 评论 -
51nod 1279 扔盘子(思维题)
【分析】如果第i个井宽大于第i-1个,那么大于的那部分是完全没用的。就可以减掉那部分,于是井就变成了一个从上到下非递增的,两个指针O(n)就可以解决了#include<iostream>using namespace std;int a[101000];int b[101000];int main(){ int n, m, ans = 0; cin >> n >> m;原创 2017-04-01 13:48:52 · 285 阅读 · 0 评论 -
51nod 1105 第K大的数
二分法。 二分套二分。很好玩的一个题目。 把两个数组排序 先二分结果,再去判断这个结果是不是第k大。判断时候枚举a数组里面的值,二分查找b数组里面最小可以和当前枚举的a数组里面的值相乘大于第一层二分的结果,比如说a[i] * b[j] > k(二分的结果), 那么j后面的所有数都和a[i]相乘都比k大,最后统计一下有多少个比k大#include<cstdio>#include<algorit原创 2017-07-29 14:37:06 · 210 阅读 · 0 评论 -
51nod 1107 斜率小于0的连线数量
按x坐标排序,求y坐标的逆序对 归并排序求逆序对:#include<cstdio>#include<algorithm>using namespace std;const int maxn = 1e5 + 5;struct p{ int x, y;} a[maxn];int b[maxn];long long ans = 0;int cmp(p a, p b){ retu原创 2017-07-29 15:00:44 · 264 阅读 · 0 评论 -
51nod 1109 01组成的N的倍数
这个题我是用广搜做的,话题里面的抽屉原理没有想到怎么做。 搜索的时候节点记录两个值,一个是余数,一个是节点的编号,因为这是一颗二叉树,节点编号的二进制形式,刚好是我们需要的结果。对于余数,还要开一个数组去重。#include<cstdio>#include<queue>#include<iostream>using namespace std;const int maxn = 1e6 + 5原创 2017-07-30 09:40:28 · 232 阅读 · 0 评论 -
51nod1110 距离之和最小 V3
据说可以每个把每个点的权值看作在这位置上有几个点,但我的想法比较简单粗暴:每向右一步就把减去其右边的点的权值和,加上左边所有点的权值和#include<cstdio>#include<iostream>using namespace std;typedef long long ll;const int maxn = 3e5 + 10;ll a[maxn];ll n, m, sum, sub原创 2017-07-29 16:45:23 · 303 阅读 · 0 评论 -
51nod1108 距离之和最小 V2
我们写一下就可以发现: 假设符合要求的点的坐标为(x, y, z); 那么ans = |x - x1| + |y - y1| + |z - z1| + |x - x1| + |y - y2| + |z - z2|…… 由于求的是曼哈顿距离,x 和 y z坐标之间没有相互制约关系,所以让x y z 分别为xi yi zi(i = 1 2 3 ……)的中间点就好了#include<cstdio>#原创 2017-07-29 16:14:38 · 319 阅读 · 0 评论 -
51nod 1154 回文串划分
想了好久,突然看到了话题是动态规划,就明白了。 先n^2预处理出来以每个字符结尾的回文串。然后动规,对于每一个字符,要么自成一家,要么接在前面的字符上。#include<cstdio>#include<iostream>#include<string>#include<vector>#include<algorithm>using namespace std;string s;vect原创 2017-07-31 13:12:42 · 292 阅读 · 0 评论 -
51nod 1191 消灭兔子(优先队列好题)
一开始的想法是用二分图贪心来做,结果T了。然后想了想,可以用优先队列来做。 先按兔子的血量从小到大排序,同时箭的伤害从小到大排序。枚举每一只兔子i,找出第一支能杀死它的箭,从这支箭往前到第一支能杀死第i-1兔子的箭都能杀死前i-1只兔子。把这些放入优先队列,去前i-1小的值。再把这只箭放入优先队列。#include<cstdio>#include<vector>#include<algorit原创 2017-07-31 14:49:58 · 318 阅读 · 0 评论 -
51nod1441 士兵的数字游戏
对于一个数,可以玩的轮数就是它质因子的个数。先预处理出来5e6以内所有数的质因子数,因为给出的是a!/b!的形式,两个数乘除就相当于质因子数的加减,所以可以求一下前缀和。#include<stdio.h>using namespace std;struct p{ int k, tot; } a[5000100];int f[5000100];int s[5000100]; int m原创 2017-08-25 16:17:12 · 299 阅读 · 0 评论