基础&&创新
leohujx
这个作者很懒,什么都没留下…
展开
-
CF #310 (Div. 2)
这场做的还行。题目也容易懂。 A. Case of the Zeros and Ones 题目大意就是给你一串01字符串,如果其中任意相邻的两个字符串为01,那么就可以消去这两个,问你最后剩下字符串的长度。 其实只要统计下0和1这两个字符的个数,取个数少的2倍,用总的长度减去它就行。#include<stdio.h>#include<iostream>#include<string>#i原创 2015-07-09 11:48:37 · 349 阅读 · 0 评论 -
CF #328
A:每次在一列中遍历所有行即可,从上往下找找第一个能到顶端的”W”,从下往上照找第一个能到底端的“B”,最后比较较小的那个就行。但是注意题目有说“W”的先动,所以如果它们到达目的地的步数一样时,A获胜。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#includ原创 2015-11-03 11:31:17 · 454 阅读 · 0 评论 -
CF #329
A:暴力枚举两个字母,然后判断符合条件的字符串,找到最大长度就行。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#includ原创 2015-11-05 17:49:36 · 324 阅读 · 0 评论 -
poj2976
说说思路吧。 我们假设a[i]+a[i+1]+…a[k]/(b[i]+b[i+1]+…b[k])=ans,那么得 (a[i]+a[i+1]+..a[k])-(b[i]+b[i+1]…+b[k]) *ans=0,题目要求的就是最大的ans,使得式子成立,我们二分这个ans (0< ans<1.0),针对每一个ans,我们计算出每一项a[i]-b[i]*ans的值,题目中又说了,舍去k项,而我们要使原创 2015-10-06 15:37:10 · 409 阅读 · 0 评论 -
CF #324 (Div. 2)
A:因为t只有2到10的范围,所以直接在最前面写上一个t,然后后面补齐0就可以了。当然,t=10的时候要注意一下。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>原创 2015-10-07 15:44:16 · 324 阅读 · 0 评论 -
poj3045
这道题目看了下题解,想法真棒。 题目中所求的是将最大风险最小化。那么对于某个牛i,假设它+它上面的牛的总重量为sum,那么它的风险就为(sum-a[i].w)-a[i].s,即 sum-(a[i].w+a[i].s),从这个式子可以看出,a[i].w+a[i].s越大越好,所以我们将w+s的大小排序,大的放下面,小的放上面,然后遍历一遍,找到最大风险,此时的最大风险就是最小的了。#include原创 2015-10-06 12:16:07 · 609 阅读 · 0 评论 -
poj 2674
题意是有一个一维的世界,长度为l,这个世界上有n个人,他们分别位于这条直线上的某个位置,一直以v m/s的速度朝着正或反方向前进,直到走出这个世界。他们每个人都有个名字,如果某两个人相遇,那么他们会调头走,问你最后一个走出这个世界的人的名字是什么。 这道题目和 一条杆上蚂蚁相遇掉头差不多,但这里要你输出名字,其实原理差不多。我们将两个相遇的人掉头这件事 等效为 两个人相遇后交换名字,然后还是直走。原创 2015-11-07 13:05:31 · 392 阅读 · 0 评论 -
poj3977
题目意思很好懂。一共有n个数字,选择其中的几个数字组成一个集合,使得它们的和的绝对值最小,输出这个集合的规模以及最小的那个绝对值。 n最大35,假设用暴力,那就是1<<35,这个数实在是太大了,所以我们选择用 折半+二分查找。即首先我们选择其中的一半数据(称为mid),然后计算出其中所有数据的集合情况,一共有1 << mid种。接着我们遍历n-mid那一部分的数据,选择一个合适的数,来放入之前的集原创 2015-11-07 22:34:23 · 367 阅读 · 0 评论 -
poj 3111
这道题目跟2976差不多,也是二分那个最大的值,然后化成计算式,排序以后得到一个数组,取最大的前k个,然后记录结果,继续二分即可。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include原创 2015-10-08 10:47:22 · 275 阅读 · 0 评论 -
poj 3597
仍然是二分。 因为N很大,我们无法直接算出吧所有的difference,然后求得其中的中位数,但是我们可以二分那个中位数mid,然后看对于数组中的每个数,值大于a[i]+mid的总的个数是否大于所有difference总数的一半,当然,首先我们得将原数组排序,求个数的时候我们也是用的二分。#include<stdio.h>#include<iostream>#include<string>#原创 2015-10-08 11:54:09 · 284 阅读 · 0 评论 -
poj3685
二分套二分。 我们首先二分第m大的数是多少,二分出来以后,我们去判断整个N*N的矩阵里面小于它的数有多少个。通过观察i*i + 100000 * i + j*j - 100000 * j + i * j 这个式子,我们可以发现,当j不变时,式子的值是随着i的变大而变大的,即随i单调递增。那么我们就枚举每一列,然后二分所有的行,看看在那一列中小于那个数的有多少,统计所有列的情况,加起来,判断小于的个原创 2015-10-09 12:23:09 · 425 阅读 · 0 评论 -
poj2549
枚举+二分。首先用两个for循环确定所有a+b的值,然后再用两个for循环确定所有d-c的值,然后枚举a+b的值,二分所有d-c的值,看是否有相等并且符合条件的值,更新保存最大的d值,最后输出。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<io原创 2015-11-08 10:58:17 · 329 阅读 · 0 评论 -
poj 1759
一共有n只灯笼,已知最左边的一只离地高度为h1,后面的灯笼离地高度满足 Hi = (Hi-1 + Hi+1)/2 - 1, for all 1 < i < N ,求最后一只h[n]的离地高度的最小值B。 上面的式子可以化为Hi+1 = 2*Hi-1+2-Hi-2。我们二分第二只灯笼的离地高度,用上面的式子求出最后一只灯笼的高度,如果过程中又出现某只灯笼的高度小于0,那么说明二分出的高度太小了,否则原创 2015-10-26 20:14:40 · 385 阅读 · 0 评论 -
poj 2566
给你一个n长的序列,然后有k个询问,每个询问一个t,问你在n长的序列中和最接近t的为多少,并且输出此区间的左右边界。 尺取法第一题。 尺取法,就是以O(n)的效率来解决一个序列的端点移动问题。 在这里,我们要求最近接t的和,那么首先,因为数据较大,所以我们先预处理出所有的前缀和,而且得按值排序,这样子才能准确的移动“尺子”的端点。而且排序完以后也不会对结果造成影响,因为这道题目是取绝对值,所以原创 2015-10-26 22:55:50 · 441 阅读 · 0 评论 -
cf #325 (div2)
这场第四题没看懂样例,,研究Note好久。。最后发现自己少看了一句话。(:зゝ∠) 不过还好,前三题都比较顺利通过了。 A:我们舍去前导零和后导零,然后遍历那个安排表,按照它的题意计算即可。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<io原创 2015-10-13 13:21:36 · 311 阅读 · 0 评论 -
poj 2739
先用素数筛选法筛选出一定范围内的素数,然后用尺取法计算有几种符合条件的即可。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#i原创 2015-10-27 11:22:51 · 288 阅读 · 0 评论 -
poj2376
区间覆盖问题,思想比较简单,就是贪心,刚开始我们选一个由1开始覆盖最长的区间1-x,那么接下去我们就选左边界<=x+1,右边界最大的那个即可。 实现起来不难,但是坑点比较多。 1.[1,2]&[3,5]是可以覆盖1-5这个区间的,所以第i个区间的左边界只要<=第i-1个区间左边界+1即可。 2.当已经全部覆盖的时候,要及时跳出循环。#include<stdio.h>#include<iost原创 2015-09-08 11:00:49 · 305 阅读 · 0 评论 -
poj 3190
仍然是区间的贪心问题。 贪心策略是这样的:我们首先将所有的牛按照区间A-B的A从小到大排序,然后用优先队列维护这个区间,排列规则是按照B从小到大排序,对于第i头牛,如果它的A大于此时最小的B,那么说明它们可以在同一个牛棚,它们的编号就是相同的。否则,就新开一个牛棚。#include<stdio.h>#include<iostream>#include<string>#include<stri原创 2015-09-08 14:44:13 · 309 阅读 · 0 评论 -
poj2718
源链接:http://poj.org/problem?id=2718 此题数据不大,最简单的做法就是直接用next_permutation来对原数组进行排列组合,我们知道,如果要使两个和最小,那么它们的长度肯定差不多,所以我们就对排列后的数组进行分割(注意原数组长度的奇偶性)。 这道题目有几个要注意的地方: 1.就是输入的格式问题,我们输入的时候每一个case,是以’\n’结尾,而最后一个ca原创 2015-09-05 10:41:45 · 372 阅读 · 0 评论 -
CF #308 (Div. 2)
太久没有打代码了。。。感觉脑袋根本已经秀逗了。。最奇怪的是,我连题目都看不懂了。。(:зゝ∠) 嗯,要多练了。 A. Vanya and Table 题目大意就是给你n个矩阵,对于每个矩阵,给你两个角上的坐标,求所有格子被覆盖的次数的总和。 直接做就行,对于每次覆盖,我们计算有几个格子被覆盖,然后重复n次,总和就是答案。#include<stdio.h>#include<iostream>原创 2015-07-08 22:33:55 · 306 阅读 · 0 评论 -
CF #309 (Div. 2)
A. Kyoya and Photobooks 题目大意就是给你一个字符串,让你在任意一个位置插入一个a-z的字母,问你一共有几种方法。 可以找规律,假设字符串长度为n,那么一共有n+1个位置可以任意插入26个字母,则26*(n+1),又因为其中有n个是重复的,比如在a前后插入一个小a后,为aa和aa,重复了一个。#include<stdio.h>#include<iostream>#inc原创 2015-07-09 14:42:05 · 282 阅读 · 1 评论 -
poj_2965
其实这道题目和1753差不多,但是我们可以有更简单的方法。对于每一个’+’号的棋子,我们一定会去翻它。遍历整个棋盘,都按照上述说的去做,在这个过程中,我们统计每个棋子被翻的次数,最后对于每一个棋子,如果它的被翻次数是奇数,那么我们就说这个棋子是需要被操作的,而偶数的就相当于不需要操作,仍然保持原来的状态。#include<stdio.h>#include<iostream>#include<st原创 2015-06-12 16:40:27 · 287 阅读 · 0 评论 -
hdu5288
题目原意就是给你n个数,叫你在区间[l,r]内(1<=l<=r<=n)中找到一个数i(l<=i<=r),使得在区间[l,r]内,没有j(j<>i)满足a[i]%a[j]==0,换句话说,就是没有a[i]的约数。 我们如果求得一个包含i的最大区间[l,r],那么这个i出现的次数就为(i-l[i])*(r[i]-i),我们只要求包含i的最大区间[l[i],r[i]]。 显而易见的是,l[i]肯定是越原创 2015-07-25 13:59:50 · 404 阅读 · 0 评论 -
cf307_B
此题不难,但是刚开始想的比较复杂,想法有还是比较好写的。我们枚举字符串b出现的次数(0<=num<=strlen(a)),然后可以知道字符串c最多可以出现几次,边枚举边记录最大的次数和b,c各自出现的次数,最后输出即可。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm原创 2015-06-14 16:03:58 · 627 阅读 · 0 评论 -
poj3061,3320
poj3061: 此题是求一个序列中使得和不小于s的最短子串的长度。 这里介绍一种方法,叫做尺取法,效率为O(n),只需要遍历一遍数组即可。 我们引入sum代表当前的和,st代表子串的开始位置,t代表符合条件的子串的结尾位置,那么长度就是 t-st.#include<stdio.h>#include<iostream>#include<string>#include<string.h>原创 2015-08-07 16:39:09 · 274 阅读 · 0 评论 -
hdu5353
这道题目因为围成的是一个圈,所以直接模拟的话情况会比较复杂,我们将环分割出来,成为一条直线,那么就比较好模拟。 怎么分割那?我们只要枚举0号和n-1号这两个人之间的交易即可。 由题目可知,有三种交易: 1。什么都不做 2。0号给n-1号一个糖果 3。n-1号给0号一个糖果 枚举之后,我们就可以根据此时的状况来进行模拟,对于相邻的i和i+1来说,如果i的数目不足平均数,那么从i+1那里拿,原创 2015-08-07 23:32:17 · 424 阅读 · 0 评论 -
hdu5365
真的是,看了题解,感觉智商被完爆了。。 其实当时在判断正三角形的时候我就觉得如果坐标都是整数的话不太可能,结果也没细想,原来只有正四边形才能保证坐标都是正整数。。 知道这个就好啦,枚举四个点,判断能否构成正四边形即可。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorith原创 2015-08-09 11:45:03 · 541 阅读 · 0 评论 -
CF #316(Div2)
A:水题,读懂题意就不难了。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<queue>#include<stack>#include<i原创 2015-09-02 11:26:49 · 259 阅读 · 0 评论 -
poj 1017
模拟题,我们按照先放体积大的,再放体积小的贪心思想来放,就能够使得盒子总数最少,具体看注释。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<q原创 2015-09-08 16:55:02 · 227 阅读 · 0 评论 -
poj 2393
贪心思想。对于第i周,我们取的价格要么是本周的,要么是前几周生产费用+存储费用。更新下每周的价格以后就可以计算总的最小的花费。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<t原创 2015-09-08 15:36:01 · 302 阅读 · 0 评论 -
poj 3040
这个题目挺难想的,,就算知道怎么做,都不太好写。。 思路是这样的:一共有n种货币,我们已知每种货币的面值v和数量b,我们也知道每周至少要支付c。那么如果有某种货币的面值超过c,那么这种货币就可以直接支付b个星期,然后将其数量置为0. 对于另外的货币,我们按照面值从大到小先每个拿尽量多的,只要不超过c.如果没有拿够c,那么我们就从小到大的拿,而且一张一张拿,拿到直到c,然后计算所有使用过的货币所能原创 2015-09-08 21:30:50 · 382 阅读 · 0 评论 -
poj 1862
此题理解了就很简单。对于一个重量为m1,m2的stripies,它们相遇后产生一个新的重量为2*sqrt(m1*m2)的stripies,那么我们的贪心策略就是每次挑选两个质量最大的stripies来“相遇”,因为我们可以看出来,越早挑选的stripies,它在之后所经历的开方层数越多(因为它不断遇到新的stripies,那么计算更新的stripies时,它就要经历新的开方),那么如果大的能够早点产原创 2015-09-08 22:45:48 · 338 阅读 · 0 评论 -
poj 3262
这道题目直接被猜中了贪心的策略= =。就是对于每只羊的t,d如果d/t越大,那么就应该先被送回羊圈。证明的话比较复杂一点,discuss里面有。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#原创 2015-09-09 13:14:59 · 345 阅读 · 0 评论 -
CF #318(Div2)
A:枚举1号的得票数,对于得票数x,2-n号大于x一定得减小到x-1,其它的可减可不减。#include<stdio.h>#include<iostream>#include<string>#include<string.h>#include<algorithm>#include<iomanip>#include<vector>#include<time.h>#include<que原创 2015-09-02 17:48:07 · 247 阅读 · 0 评论 -
poj 2100
给你一个数n,求k串连续的数字,使得它们的平方和等于n。输出先输出k,然后按连续数字长度从大到小输出符合条件的答案。 还是尺取法。不过这道题目刚开始做的时候我先把10^7之内的数字的平方先预处理了下,结果MLE了。。 后来就直接计算,按照尺取法走一遍,就好了~#include<stdio.h>#include<iostream>#include<string>#include<string原创 2015-10-27 12:12:25 · 420 阅读 · 0 评论