随笔分类 - ACM——思维
摘要:http://acm.zju.edu.cn/changsha/showProblem.do?problemId=31题意:给你n个非负整数,然后输入n个x[i],x[i] == -1表示第i个数不知道是多少,x[i] != -1表示第i个数是x[i], 然后我们在给出每个数和他左右邻居的和,起点终点只有两个数的和a[i],输入下标x求x[i]可能取得的最大值,如果x[i]已经知道就输出x[i];思路:首先我们分析可以知道x[2],x[5],x[8] ..... 都是已经知道的(下标从零开始), 其次我们只要知道其中的除了x[2],x[5]..这种情况的数的其他任意一个我们都能够求出整个序列,所
阅读全文
摘要:http://poj.org/problem?id=1456题意:给出n个折扣热卖的商品,给出每个产品的(pi,di)表示第i个热卖商品,卖出去可以获得利润pi,最晚期限是第di天。让你设计一个合理的出售列表,使获得的利润最多。思路:才开始完全理解错了题意,以为当出现最晚期限一样的时候只能买一种呢。直接排序做了。WA..后来看了discuss里面,原理理解错题意了。首先要理解这种情况,如果有这样的数据 (2,1) (3,2),(4,2)我们要在第一天卖(3,2)第二天卖(4,2)才能得到最大的利润。那么如何求呢。我们利用优先队列来存储第几天卖那一种,那么这个优先队列的大小size就表示了我们前
阅读全文
摘要:http://acm.sdut.edu.cn/sdutoj/showproblem.php?pid=1493&cid=1149题意:中文......思路:首先对于基本勾股数来说,有这样一个特点即gcd(a,b,c) = 1; 而对于所有勾股数有gcd(a,b) = gcd(b,c) = gcd(a,c);存在一个构造基本勾股数的方法:条件 :(m > n > 0) ,gcd(m,n) = 1 , m 与 n 的奇偶性不同 => a = m*m - n*n ; b = 2*n*m; c = m*m + n*n; a.b,c不确定到底谁最大。根据题意我们知道,a + b
阅读全文
摘要:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1446超级玛丽题意:中文...思路:比赛时,数据弱了,让我一个O(10^12)的程序都过了,后来就没多想,加上数据后。改为O(n)的才过。枚举能跳过的云彩数,然后对跳跃的长度D取余求商,计算余数+ M与L的差值(即云彩之间的距离)在检查看看能否跳过,如果不能,就截止在这里不会继续往下跳了。注意数据类型long long//#pragma comment(linker,"/STACK:327680000,327680000")
阅读全文
摘要:http://codeforces.com/problemset/problem/254/C题意:定义t是s的Anagram,满足条件是:t与s的字符相同。strings "DOG" and "GOD" are anagrams给定两个串,分别为s,t 求满足s经过最少的替换次数能够成为t的Anagram的可能里面的字典序最小的字符串。输出最少次数和经过替换后的最小字典序的s思路:总共一共26个英文字母,我们记录每一个英文字母需要加减的个数(即要替换的和被替换的个数)。然后遍历一遍s,当前字符如果需要减小,则用需要增加字符里面最小得的替换。这里关键是如何
阅读全文
摘要:http://codeforces.com/problemset/problem/245/E题意:给出一个序列包括'+' '-'两个字符,+表示有人进入该房间,-表示有人离开该房间。这里保证没有同时进出的。求进入过房间的人的最小数目。思路:ym那些大牛们这么快就AC了,这题真是考思维的,哎,弱爆了。。我们考虑,如果遇到‘-’表明肯定有人在房间,并且要出去。所以每当遇到‘-’时,我们只要检查记录里面是否有+,如果有的话,就表明这个人出去,如果没有,就说明原来屋子里有个人我们没有记录,现在要出去了,只要+1即可。我们的到的保持进屋子的最大长度的‘+’序列就是答案。#
阅读全文
摘要:http://codeforces.com/contest/244题意:给定n个数的序列,n(1 ≤ n ≤ 105) 定义f[l,r] = a[l]|a[l + 1]|......|a[r]求该序列所有所有的不同的f[i,j]的值的个数;思路:这题当时看错了写了个n*logn(n)的算法自以为很好结果一提交WA。很明显算法错了。后来怎么想也没想出什么优化来。思维啊.. 纯暴力是(n^3)我们可以通过这个循环来优化到O(n^2) f[j]表示j到i这一段取或操作得到的数for (i = 0; i < n; ++i){ for (j = 0; j < i; ++j){ f[j...
阅读全文
摘要:http://codeforces.com/contest/231/problem/B题意:给你一个长度为n的序列每个元素的取值为[1,l] 然后进行如下操作,每次将 a[n - 1] - a[n] 替换a[n - 1]使原序列个数减1,最后得到一个数字d。给你长度n,最后得到的数d,和l。找去满足条件的序列。思路:这题真心不好想啊,首先我们能够退出 x1 - (x2 - (x3 - (.....)))得到x1 - x2 + x3 - x4 + x5 -... = d; 所以有(x1 + x2 + x3 ....) - (x2 + x4 + x6 + x8....) = d;这个公式,我想到这
阅读全文
摘要:http://codeforces.com/problemset/problem/216/C题意:在Berland法律规定每个工人的工作是这样的:它必须连续工作n天,然后休息m天,然后才能继续工作n天休息m天也即他的工作时间为[x, x + 1, ..., x + n - 1],[x + m + n, x + m + n + 1, ..., x + m + 2n - 1]Vitaly的工场必须保证每天有k个工人,而且还要保证在第n天时,有员工能够接任工厂钥匙。Vitaly想尽量少的雇用工人,以减少花费。求他最少雇用员工的个数以及他们分别在第几天雇用。思路:自己开了虚拟比赛做的题目,好不容易把A
阅读全文
摘要:http://codeforces.com/problemset/problem/232/A题意:给你一个数k,用n个点画出k个长度为3的环,然后输出n的个数以及图的矩阵表示,mat[i][j] = 0表示无边 1表示有边。思路:如果存在n点的话,则最多能够组合出的长度为3的环有c(n,3)个,当然这些特定的数,不能把k,全部表示出来,我们首先找出C(i,3)<=k的最大的i,然后不断往里面添加点,当我们添加一个点之后,我们可以从已有的图形里面的i个点里面选出2两个与刚加入的节点构成三元环,就这样枚举直到满足k个。View Code #include <iostream>#i
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4287题意:给出n个手机数字序列,m个英文组合,求每个数字序列对应的可能的英文组合在下边的出现了多少个。思路:才开始想复杂了,其实只要用一个map即可。View Code #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>#include <cmath>#include <queue>#include <stack>#includ
阅读全文
摘要:天津赛区网络赛的两道题目1:http://acm.hdu.edu.cn/showproblem.php?pid=4282题意:给你一个K (0 < K < 2^31) ,求正整数X,Y,Z满足X^Z + Y^Z + XYZ = K,有多少组。(X < Y, Z > 1)思路:如果暴力枚举的话,肯定会超时。这里关键是31.因为1<=X < Y 所以Y>=2所以Z<31;对于X他最大肯定小于5000(因为50000^2 > 2^31)所以我们只要枚举x和z然后在区间[x + 1,5000]二分查找即可O(50000*31*log(50000))
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4279题意:给出a,b两个数,1<=a<=b 如果a,b不互质,且a%b != 0则说明a是b的特殊数字f[i]表示i拥有的特殊数字的个数,如果f[i]是奇数,那么i就是real numbers给出区间[x,y]求区间内的real numbers的数量。思路:打标找规律,真心不好发现这规律;大于12之后 d[x] = x/2 -1或者d[x] = x/2 - 2;(d[x]表示1到x拥有的real numbers的数量)发现在遇到平方数是转变原来-1变为-2,否则-2变为-1。 p^2 <=
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=4278题意:一个特殊的汽车行程计数器,当每个位出现3或者8时直接跳到下一位;0 1 2 4 5 6 7 910 11 12 14 15 16 17 1920 21 22 24 25 26 27 29......思路:YY发现其实可以映射到8进制数,(0 - 9)表示10进制数,将(0 1 2 4 5 6 7 9 )映射到(0 - 8)其实就是8进制的表示。View Code #include <iostream>#include <cstdio>#include <cstring
阅读全文
摘要:http://poj.org/problem?id=1054题意:给你r*c的一块稻田,每个点都种有水稻,青蛙们晚上会从水稻地里穿过并留下脚印,问题确保青蛙的每次跳跃的长度想相同,而且沿直线行走,给出n个青蛙的脚印点问存在大于等于3的最大青蛙走的连续的脚印个数;若不存在输出0思路:这题O(n^3)的三次方+j剪枝竟然能过无语了。。。。首先排序,然后O(n^2)枚举任意两点找直线,O(n^2)判断同一直线并且是同一青蛙留下的脚印然后求最大值。剪枝:1:青蛙的起点肯定在稻田外;2:该点的直线上的脚印一定要大于上一次的点数;3:多余上一点的基础上点要在稻田内;View Code #include &
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=10312012 新年A的第一道题目。纪念一下。水题: 有m个东西要n个人评价给分,求出k个人的评价给分最高View Code #include #include #include #include using namespace std;#define MAXN 1000struct node{ double val; int num;}tagp[MAXN];bool cmp1(node a,node b){ return a.val>b.val;}bool cmp2(int a,int b){ ...
阅读全文