![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
技巧&模拟&思维
算球?
在校学生
展开
-
51nod 1393 0和1相等串(前缀和)
前缀和O(n)搞定 把0看成-1,当某个i的前缀和prefixSum[i]和某个j的prefixSum[j]相等,则(i,j]这一段0和1个数相等。记录这个前缀和最早出现的位置,后边再出现相同前缀和时,更新答案就好#include <bits/stdc++.h>using namespace std;const int MAXN = 1e6+10;int MAX = 1e6;int inde原创 2017-07-30 00:10:58 · 214 阅读 · 0 评论 -
hdu 1556 Color the ball(线段树 or 树状数组 or 前缀和)
#include #include typedef struct node node;struct node{ int l,r,sum;};node ball[300000];int n;void BuildTree(int t, int l, int r){ ball[t].l = l; ball[t].r = r; ball[t].sum =原创 2016-06-19 21:40:33 · 654 阅读 · 0 评论 -
51nod 1414 冰雕
暴力枚举#include <bits/stdc++.h>using namespace std;const int MAXN = 2e4+10;int num[MAXN];int main(){ int n; ios::sync_with_stdio(false); cin >> n; for(int i = 0; i < n; ++i) cin原创 2017-08-05 10:51:06 · 225 阅读 · 0 评论 -
51nod 1668 非010串(矩阵快速幂)
怎么说呢,找了半天规律,找完规律后,发现中间算错了一个数 把数改过来后,原来找的规律就没了。。。。求助于讨论版 #include <iostream>#include <vector>using namespace std;typedef long long ll;typedef vector<ll> vec;typedef vector<vec> mat;const ll mod =原创 2017-09-15 19:25:37 · 301 阅读 · 0 评论 -
51nod 1682 中位数计数
一看数据,O(n^2)可过 我是先向右找,边找边统计有多少个区间能够使当前位数字为中位数,同时记录在每个区间 比当前数字小的数的个数-比当前数字大的数的个数 所得到值的个数。统计完后继续向左统计,统计有多少个区间符合条件,然后同时加上 比当前数字大的数的个数-比当前数字小的数的个数 所得值的个数。 假设当前数字为x,如果左边lt个数字>x,rt个数字#include <bits/stdc++原创 2017-09-15 17:31:10 · 230 阅读 · 0 评论 -
Codeforces Round #436 (Div. 2) C. Bus(模拟)
《挑战程序设计竞赛》将优先队列的那里,讲了一个和这个差不多的例题。 我是把所有路合成了一条直的线路,枚举路中间每个加油站,看车是否能到达这里,然后模拟一发就过了。#include <bits/stdc++.h>using namespace std;const int MAXN = 1e4+10;typedef long long LL;LL A[MAXN];int main(){原创 2017-09-25 22:55:41 · 204 阅读 · 0 评论 -
hdu 6119 小小粉丝度度熊(尺取法)
合并相互交叉的区间,尺取法#include <bits/stdc++.h>using namespace std;const long long MAXN = 100100;struct node{ long long s,e;};node prens[MAXN], nns[MAXN];long long n,m,cnt;bool cmp(const node& a, const原创 2017-08-14 13:55:20 · 710 阅读 · 4 评论 -
51nod 1491 黄金系统
得益于数据量小,用比较丑的暴力姿势也过了。。。 找规律会发现qn=qn−1+qn−2q^{n}=q^{n-1}+q^{n-2},我是把每个高位的1分解成两个低位的1,多分解几次,暴力水过。 这里的暴力姿势我感觉比较好: http://blog.csdn.net/mengxiang000000/article/details/53538476#include <bits/stdc++.h>us原创 2017-10-01 20:13:13 · 304 阅读 · 0 评论 -
51nod 1804 小C的多边形
思路:先求出所有三角形的边长和,结果是(3 * n * (n-1))/2,这个长度是(n-1)个三角形的和,所以一定能被(n-1)整除,同时也要被2整除,这就排除掉了n是奇数的情况,((3 * n * (n-1))/2)/(n-1)=3 * n/2,即每个三角形 周长为3 * n/2,知道周长了,就可以挨个算出来边的长度了。#include <bits/stdc++.h>using namespa原创 2017-10-02 13:40:32 · 188 阅读 · 0 评论 -
51nod 1205 流水线调度(Johnson规则)
对于加工顺序相同的两个或两个以上作业在两台机器上的加工排序,称之为:n个作业两台机床的作业排序问题,经典的启发式排序方法为Johnson规则。 其目的是最小化Makespan。 资料: https://wenku.baidu.com/view/28dd298751e79b89680226cc.html 这就是个套板子的题目了。。#include <bits/stdc++.h>using n原创 2017-10-03 21:35:31 · 1994 阅读 · 1 评论 -
51nod 1350 斐波那契表示(规律)
或许我是为数不多的找到规律却实现不出来的。。。 代码参考:http://blog.csdn.net/jaihk662/article/details/60896217 规律还是比较好找的,把F函数的值算出几十项来就很好观察了。1 1 F(1)1原创 2017-10-14 15:06:23 · 263 阅读 · 0 评论 -
51nod 1451 合法三角形(暴力,思维)
先枚举了下相同x坐标和相同y坐标的情况,总情况减去后发现不对,少了个相同斜率的情况。那就枚举斜率,正好还包含了坐标相等的情况,反正数据范围小,暴力搞呗。用pair保存分数的最简形式。#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 2010;struct Point{原创 2017-10-26 12:59:31 · 311 阅读 · 0 评论 -
51nod 1483 化学变换
并没有想到怎么去做,看的别人的思想。 玩的还是暴力。。。。。 把每个数字*2和/2都得到的数字都统计一遍,范围就1e5,能变换到的数字也不会太多,然后找符合条件的,首先就是这n个数都能变换成这个数字,然后变换次数还要是最少的,打个表就完事了 统计的时候,如果当前数字num是个奇数,则num/2要一直*2打表到1e5之外,如果num是个偶数,则num/2则不需要*2向上打表了,因为那些都在num原创 2017-08-03 23:28:21 · 332 阅读 · 0 评论 -
51nod 1276 岛屿的数量
参考:http://blog.csdn.net/qingshui23/article/details/51867942 我先用rmq+dfs做的,超时。。。然后看了看讨论,没看懂讨论的啥,看了题解后,才明白。原来这题是用的离线做法,先把所有查询都读取进来后再进行处理,这样时间复杂度就很低了。第一次遇到这样做的题目,涨知识。#include <bits/stdc++.h>using namespa原创 2017-08-03 23:09:16 · 246 阅读 · 0 评论 -
51nod 1127 最短的包含字符串(尺取法)
经典尺取法#include <bits/stdc++.h>using namespace std;const int MAXN = 100010;char str[MAXN];int mark[26];bool check(){ int cnt = 0; for(int i = 0; i < 26; ++i) if(mark[i] > 0)原创 2017-07-29 23:55:51 · 233 阅读 · 0 评论 -
51nod 1396 还是01串
统计1的个数就是答案 假设现在有一个长度为n的串有n(n>=0)个1,这时候的合法位置就是n,你可以试着向串里插入几个0,会发现,在n位置前边插入0,要么把一个1挤到n后边,要么把一个0挤到n后边,n左边的0和右边的1始终保持相等。0插到后边不算数。。讨论里有个证明:设所有数字和为sum,k位置断开,前半段和为i,后半段为sum - i;前半段有sum - i 个 0 (题设条件),有k - su原创 2017-07-30 00:22:43 · 163 阅读 · 0 评论 -
51nod 1418 放球游戏
分了一堆情况。。。。#include <bits/stdc++.h>using namespace std;//0 1 2 R G Bint record[3];char str[55];void add(char ch){ if(ch == 'R') ++record[0]; else if(ch == 'G') ++record[1];原创 2017-07-30 00:26:35 · 235 阅读 · 0 评论 -
hdu 6047 Maximum Sequence
先把b升序排序,这样使用b的时候从小的开始用,这样选择范围大,可以确保开始的时候就能尽量的选到大的aj-j,这样后边得到的aj-j也是尽量的大的。 a数组是动态变化的,而且每次都要选出最大的aj-j,所以用优先队列来维护#include <bits/stdc++.h>using namespace std;const int MAXN = 250010;int b[MAXN*2];const原创 2017-07-30 19:04:32 · 242 阅读 · 0 评论 -
51nod 1065 最小正子段和
求前缀和,然后升序排序。排序后相邻两个前缀和只差越小,比如prefixSum[i+1],假设他原来坐标是n,和prefixSum[i],假设他原来坐标是m,他俩差越小,则表明区间(m,n]之间的正整数和越小,前提是n>m。还有排序的时候如果有多个前缀和相等,则把下标大的放在前边,下标小的放后边。 比如输入数据: 4 0 4 1 -1 自己写一下就知道为啥那样排序了。#include原创 2017-07-31 09:03:24 · 232 阅读 · 0 评论 -
51nod 1098 最小方差
排序之后,扫一遍即可,排序后,在这段序列中连续的一段序列的方差肯定比不连续的序列的方差小,因为连续的序列相对于平均值来说,波动的范围比较小。#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN = 10010;LL num[MAXN];LL prefixSum[MAXN];int M,原创 2017-07-31 21:21:07 · 304 阅读 · 0 评论 -
51nod 1267 4个数和为0
先把任意两个数的和打表出来,然后枚举两个数,然后再在那些和里面查找 0-n1-n2。查找到后,看一下和n1或者n2是否重复,如果不重复,才符合条件。还可能有好多两个数字的和是一样的,所以不要查找到比过就完了,还要往后看看数字是否一样。#include <bits/stdc++.h>using namespace std;typedef long long LL;const int MAXN原创 2017-07-31 21:32:24 · 236 阅读 · 0 评论 -
51nod 1873 初中的算术
BigDecimal大法好import java.util.*;import java.math.*;public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); String str = cin.next();原创 2017-07-25 22:52:54 · 418 阅读 · 0 评论 -
51nod 1770 数数字
http://www.wutianqi.com/?p=596 还是这个博客里给的题目,是第三个题目,和给的第一个差不多,确定好指数的范围就好了。#include <bits/stdc++.h>using namespace std;const int MAXN = 10000;int C1[MAXN];int C2[MAXN];int num[3];int maxn;int main()原创 2017-08-03 22:48:49 · 479 阅读 · 0 评论 -
51nod 1285 山峰和分段
暴力枚举下就好了 假设初始用n个山峰,就从n开始枚举,枚举到1#include<bits/stdc++.h>using namespace std;const int MAXN = 50010;int height[MAXN];int num[MAXN];int n,cnt;int main(){ ios::sync_with_stdio(false); cin >> n原创 2017-08-03 22:53:14 · 460 阅读 · 0 评论 -
51nod 1785 数据流中的算法
这题看了好多遍,才看懂题目中k的意思,k就是每次计算最多只能到k个人 坑点是平均数那里,在计算平均数的时候,输出平均数的时候要向下取整,然后输出的时候还要保留两位小数,然而计算方差的时候,那个平均数就不能向下取整了,否则就错了。#include <stdio.h>#include <vector>#include <algorithm>const int MAXN = 1e6+10;int原创 2017-08-03 22:59:38 · 269 阅读 · 0 评论 -
Codeforces Round #368 (Div. 2) D. Persistent Bookcase(dfs)
想不到怎么去做,暴力模拟的时候发现那个回到之前的状态搞不定,然后参考了卿学姐代码:http://www.cnblogs.com/qscqesze/p/5791698.html还有题目意思的问题,英语不好啊,对着数据调了好几遍才搞懂题目意思,即操作4的意思,原来是回到过去的某个状态,然后从那里从新开始。。。 看过代码思路就清楚了,把这些操作建成一棵树,dfs一遍就完事了,思路很棒。操作4就是树枝分叉原创 2017-11-04 19:40:27 · 214 阅读 · 0 评论