ZOJ 3620 Escape Time II 暴力建图+dfs
题意:给n m t 代表n个点m条边t是时间限制。s,e分别代表起点和终点。
给出m行,每一行包含a b c代表a和b有一条边,通过这条边的时间为c
然后再给n个数,分别代表每个点有的珠宝数。
求:在t时间内从s开始到e最多可以拿的珠宝数。
我的做法:
n不过才10而已,想什么姿势都可以什么姿势。暴力建图+dfs
//First Edit Time: 2014-07-16 14:42//Last Edit Time: 2014-07-16 14:42#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>using namespace std;vector <int> e[20];in ...
ZOJ 3621 Factorial Problem in Base K 分解质因数
题意:坑爹题意不明显。最后才理解是什么意思
给一个k进制的数和进制k,求这个数在十进制下的结果(这个结果在2^63范围内)的阶乘表示为k进制的话末尾有多少个0
比如说样例给的
101 2
表示101是二进制表示形式,把它表示为10进制是5,5!=5*4*3*2*1=120,它的二进制是:1111000,末尾有三个0,所以输出的是3
思路:
我们把这题的问题转换为:
假设s是阶乘的结果
求1~s中包含有多少个k
理由:这个很好想到的。我们可以逆向思考,假设xxx000,x表示未知的,我们可以清晰的看到,这个结果包含3个0,我们可以很容易想到,是有3个10相乘得到的结果。那么我想知道,到底是1?可以包含3个10呢?然后想一下。10是有2和5组成的对吧?那么我们就可以转换为。1?中一定要包含3个2,3个或以上的5。
现在我们再转换成正向思考,假设我知道了s,我想知道1~s中到底包含多少个2,多少个5,我取它们之间的最小值就是s!末尾的0的数目了。因为min(2的数目,5的数目)一定是10的个数。
我们总结一下:
我们想知道10进制下s!末尾是0的个数,我们就得知道1~s中包含了多少个10。
...
ZOJ 3612 Median multiset或vector+二分
题意:给定n个操作,每个操作有两种:
1)add x 把x添加到数列中,这个数列的结果是递增的,添加过后输出中间值,如果是偶数的话就输出中间两个数之和的平均值。
2)remove x 把x从数列中删掉一个,如果数列是空的或者数列中不存在这个值,输出Wrong!如果存在这个数,删去过后数列为空就输出Empty!否则输出中间值,如果是偶数的话就输出中间两个数之和的平均值。
做法:
可以使用multiset,使用这个的话要维护一个multiset迭代器。
可以使用vector+二分插入,输出时直接输出就行。
注:cout会TLE的。。printf是可以过的。。
详情代码:
代码1:
//First Edit Time: 2014-07-16 22:10//Last Edit Time: 2014-07-16 22:11#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector># ...
UVALive 6470 Chomp 记忆化搜索
题意:给一个只有三行的方阵。然后再给一个100>=p>=q>=r>=0分别代表最底部的方块数,中部的方块数,顶部的方块数。
它有以下规则:
输者:取到左下角方块的人,或者这个人面临的情况没有方块可取。
赢者:只要对手输,你就赢了。
取方块的规则为:
选定一个方块,把这个方块,以及它上面的,和它右边的,所有方块取走。
也就是说,取一个方块,把它以及它包括右上边的方块全部取走。
问题:如果先走的人能赢,它应该先取哪个方块(行从下往上标号,列从左往右标号)
如果能赢,就输出W 列 行
否则输出L
记忆化搜索
首先面临1 0 0的这种情况肯定是会输的。
所以ha[1][0][0]=0
然后,如果能多走一步,走完后面临这种情况的人一定输,走那一步的人一定赢
然后直接dfs就行。
首先从最底行开始,假设选择最底行的最后一个方块,倒数第二个方块,直到等于第二个方块为止。
同理第二行,第三行。
这题其实说起来一文不值= =
可恨我当初连题目都没读懂。
代码:
//First Edit Time: 2014-07-15 22:52//Last Edit Time: 20 ...
UVALive 6469 Deranged Exams 组合数学+容斥原理
这个题目的大概意思是:给n个座位。每个座位都有对应的人。问:至少前k个座位都坐错的种数。
直接求至少前k个座位都坐错的话有点难求。。
直接求总数-反例
把问题转换为:求至多有前k个座位坐对的总数。
假设有n=7 k=3
我们求前1个座位坐对的总数为:
C(3,1)*A(6,6)
但是考虑到这样的话会把1 3 1 2 2 3给算重
要减去1 2 1 3 2 3的总数。就是要减去C(3,2)*A(5,5)
但是减去的话又会多减去2 3的情况所以又要加上C(3,3)*A(4,4)
然后我们看一下
C(3,1)*A(6,6)-C(3,2)*A(5,5)+C(3,3)*A(4,4)
基本上就这样了。详情看代码
//First Edit Time: 2014-07-15 19:15//Last Edit Time: 2014-07-15 19:35//Filename:E.cpp#include <map>#include <set>#include <cmath>#include <queue>#include <stack>#inc ...
UVALive 6468 Pisano Periods 坑爹暴力
给一个m要求mod=m的斐波那契循环节。
这题坑爹啊= =居然直接暴力过?当时我可是以为是一个神结论我去。。
//First Edit Time: 2014-07-15 19:07//Last Edit Time: 2014-07-15 19:07#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>using namespace std;int a[1000001];int main(){ int t; scanf("%d",&t); while(t--){ int n,m; scanf("% ...
UVALive 6467 Strahler Order 拓扑排序
水题。给你n个点m条边。入度为0的点标为1,如果一个点只有一个点指向,那么它标为那个点的标数。如果一个点有两个或以上相同标号的点指向。那么给它标为i+1,如果有更大的话就标为更大的。求最大的标号。
拓扑排序
//First Edit Time: 2014-07-15 12:40//Last Edit Time: 2014-07-15 12:40//Filename:C.cpp#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>using namespace std;#define MAXN 1010#define INF_INT 0xfffff0vector <int> e[MAX ...
UVALive 6465 Islands in the Data Stream 暴力模拟
。水题。给一个你一个长度为十五的数列。让你寻找一个区间。这个区间内最小的数大于两边相邻的数,问有多少个这种区间
//First Edit Time: 2014-07-15 12:19//Last Edit Time: 2014-07-15 12:19//Filename:A.cpp#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <set>#include <vector>#include <map>#include <queue>#include <set>#include <algorithm>using namespace std;int a[20];bool check(int p1,int p2){ int mm=100; for(int i=p1;i<=p2;i++){ if(a[i]<mm ...
WIN8.1/WIN7 gvim 编译使用YCM(youcompleteme)(64/32)
如有不懂请猛戳这里
如有疑问请猛戳这里
如要转载请注明出处,谢谢
使用YCM有个美中不足的就是,文档或路径中不能包含中文(Unicode字符集),否则的话就不能自动补全
但是今天心血来潮在github上找到了解决方案。如果想看的话。用力戳我
----------------2014/7/24 2:14 by CHC
https://bitbucket.org/Haroogan/vim-youcompleteme-for-windows/overview#markdown-header-downloads
如果你不想编译的话可以直接使用老外已经编译好的。简单快捷直接上手。
----------------2015/5/19
17:55 by CHC
youcompleteme(以下简称YCM)是一款强大的自动补全工具。它在网上有很多资料。不懂问度娘。
官网的效果图:
好吧,= =原本是动态的放上来就成静态的了。
首先你需要bundle安装它。bundle的具体设置细节可以问度娘。其实也就需要git&bundle这个插件就可以。= =不多说。
首先gv ...
poj 2942 Knights of the Round Table 补图+点双连通分量+判定二分图
题意:给定n个点m条边。这些边的意思为 u和v是相互仇恨的关系
要求满足一下条件。
1)一个人的周围不能有仇恨关系的人,这些人围成一个圆圈,每个点有两个邻居。
2)会议的是由三个人以上组成,开会议的人数必须是奇数。
要求出必须剔除几个人。
在做本题的过程中我查询了一些其他博客的做法。
本题需要的知识
1)补图(已知G求~G)
2)奇圈的定义(顶点个数为奇数的圈,但也有部分人说是边的个数为奇数的圈)
3)两个定理
1.如果一个双连通分量内的某些顶点在一个奇圈中(即双连通分量含有奇圈),那么这个双连通分量的其他顶点也在某个奇圈中;
2.如果一个双连通分量含有奇圈,则他必定不是一个二分图。反过来也成立,这是一个充要条件。
可以通过下面这个例子来理解这两定理
1–>2
1–>3
1–>4
3–>4
2–>4
{1,2,3,4}是一个点双连通分量,它有偶数个点,但是它有两个奇圈,能出席两次会议
4)求点双连通分量(tarjan相关算法的知识)
5)二分图的判定(交叉染色法)
其他:显然在只要某个点双连通分量不是二分图那么它必定包含奇圈,那么这个点双连通分量中的所有点 ...