思维
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 评论 -
HDU-6156 Palindrome Function
题意:定义函数f(n, k): 当n在k进制下为回文串时,f(n, k) = k; 否则 f(n, k) = 1; 给你一个区间 [L, R].对于区间的每一个数i, 计算 j 属于 l 到 r 进制的f(i,j) 的和。分析:因为进制的区间很小,我们可以枚举每一个进制k,计算[L, R]在k进制下有多少回文数。然后结果就是区间长度减去回文串数(这些事函数值为1 的部分)加上回原创 2017-08-20 20:34:17 · 444 阅读 · 0 评论 -
HDU 6105 Gameia(2017多校第6场1010)
题意:给出一颗树,Alice 和 Bob 轮流给树节点染色。Alice将没有被染色的节点染成白色,Bob染成黑色,并且Bob染色的时候会把所有跟他选定的节点相连的节点染成黑色。如果树上的节点都被染色了,那么游戏就结束。结束的时候如果还有白色,Alice就获胜,否则Bob获胜。分析: 首先当有一条长度大于等于3的链的时候,Alice一定可以获胜。可以找出来3 和 4 的时候这个结论是成立的。(3的时原创 2017-08-10 18:13:29 · 283 阅读 · 1 评论 -
qduoj 树结构重逢 (两遍深搜)
描述 给定一颗包含n个节点的无根树,并且把节点从1-n编号。现在让你求对于每个点,求出所有点到这个点的距离的和(距离当然是最短距离了..)。输入 第一行包含一个正整数n ( n <= 100000 ),表示节点的个数。 后面(n - 1)行,每行两个整数(u, v)表示树的边u-v。输出 每行一个整数,第i(i = 1,2,…n)行表示所有节点到第i个点的距离之和。(i到i节点的距离为0)样原创 2017-07-26 16:46:28 · 448 阅读 · 0 评论 -
2017多校第一场1006 function(HDU6038)
题意: 给你一个a序列,代表1到n的排列;一个b序列代表1到m的排列。问你可以找出多少种函数关系,满足f(i)=b[f(a[i])]; 分析:这个主要是找循环节 比如说:如果 a 序列是 2 0 1 那么我们可以发现 f(0) = b[f(a[0])] = b[f(2)] f[1] = b[f(a[1])] = b[f(0)] f[2] = b[f(a[2])] = b[f(1原创 2017-07-25 17:55:02 · 1925 阅读 · 0 评论 -
1293 球与切换器
很明显从右下角的盒子下面出去的球的个数只与最后一列最下面那个切换器有关。我们可以把每一个切换器看作一个节点。每个节点向它的子节点输送它自身一半的球(如果是奇数个要判断哪个子节点得到的更多)。遍历一遍就能得到结果 遍历是n^2的,所以我们需要o(1) 找它的父节点,否则会超时。 具体看代码吧#include<stdio.h>using namespace std;typedef long lon原创 2017-08-07 19:12:17 · 259 阅读 · 0 评论 -
51nod 1153 选择子序列 (好题)
这个题很不错。 采用贪心的思想:首先考虑到在整个序列中取最大值一定是最优的,也就是说B数组的第一个数是A数组的中最大值的下标。而且通过题意我们发现,一旦选定了某个数就把当前的区间划分成两份。比如说第一次选了9,第二次选了10, 那么下一次肯定不会选8(这几个数字说的都是下标),不会垮区间选数,那么我们就可以每次选一个区间最大值,再把区间划分成两份分别查找最大值就可以了。因为每个元素最多访问一遍,再原创 2017-07-30 11:20:01 · 509 阅读 · 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 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 评论 -
codeforces#419 B q
题意:给你n个区间,然后给出m个查询区间,对于每次询问,输出这个区间里多少个点被不少于k个区间覆盖解析:求两次前缀和就好了#include#include#includeusing namespace std;int a[300000];int s[300000];int p[300000];int main(){ int n, m, k; while(~scanf(原创 2017-06-18 23:53:21 · 381 阅读 · 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 评论 -
HDU 5877 Weak Pair
题意:问一棵树中有多少序数对 < u , v >满足,u是v的祖先节点,并且这两个节点的值相乘小于或等于k。 分析:感觉这个思路还是很妙的。考虑深搜的过程,当搜到一个节点的时候,所有经过的点都是它的祖先节点。所以就可以每搜到一个点就计算经过的点中有多少个点满足和它相乘<=k。这一步可以用树状数组来计算。然后再把这个点加入树状数组。#include<cstdio>#include<algorit原创 2017-08-27 15:15:48 · 298 阅读 · 0 评论