排序与查找+杂题
文章平均质量分 52
acm_lkl
这个作者很懒,什么都没留下…
展开
-
uva--10474-- Where is the Marble?
这道题算的上是今天看到的最简单的一道题了,主要原创 2014-06-07 23:56:06 · 687 阅读 · 0 评论 -
uva--10602+贪心
题意: 某公司开发了一个编辑器,支持两条语音命令:1.重复最后一个单词,2.删除最后一个单词的最后一个字母。给你一系列的单词,问利用编辑器的功能最少需要输入多少个字母就可以将所有单词输入;要求第一个单词一定要第一个输入,其余单词不限顺序。思路: 输入第一个单词后,我们可以怎么样选择能使得输入的字母数最少?当然我们需要选择和第一个单词有最长公共前缀的单词;这就是贪心的策略:每次都原创 2014-11-23 22:51:08 · 626 阅读 · 0 评论 -
uva--11100The Trip, 2007
题意: 现在有n个不同容量的包,他们的容量用数字表示;规定小的包可以嵌套进大的包里去(但每个包只能嵌套一个包),这样安排才可以使得最后需要提的包的数目最少;在保持包的数目最少的同时,也需要使得每一个大包里面装的小包最大数目数目尽量少。思路: 开始的时候一直没想清楚最后最少的包数应该是多少;后面灵光一闪,突然就发现最后可以保留的最少包数应该就是数目最多的那种包的个数(记为cnt)。原创 2014-11-27 11:54:17 · 756 阅读 · 0 评论 -
uva--11129An antiarithmetic permutation+分治
题意: 输入一个数n,求n的一个排列,要求这个排序的任意一个子序列都不能是等差数列。思路: 想了很久,但是除了枚举以外还是没想到其它的思路,枚举是一定会超时的;到网上看了别人的解题报告才知道应该用分治的方法做。 分治的思想:考虑一个等差数列,我们把其奇数项,偶数项都提取出来;显然这两个序类内部还是等差数列,但是它们之间的元素就不可能形成等差数列了;然后我们可原创 2014-11-29 14:28:07 · 747 阅读 · 0 评论 -
uva--10720Graph Construction +Havel--Hakimi定理
这是一个定理题;定理的具体内容见:http://blog.csdn.net/shuangde800/article/details/7857246我的代码如下:#include#include#include#includeusing namespace std;int cmp(int a,int b){ return a>b;}int main原创 2014-11-25 21:54:25 · 778 阅读 · 0 评论 -
uva--11054Wine trading in Gergovia +贪心
题意: 一条街上所有人都以卖酒为生,每一天有的人需要卖掉一些酒而有的人需要买入一些酒;然后在相邻的人之间运输一单位的酒需要一单位的花费,问怎么样安排人们之间的交易,可以使得总运算费用最小。思路: 开始就想到一个贪心思路:显然每个需要买酒的人都应该尽量买他最左边卖的酒,没有的话再买他右边最近卖酒人的酒。第二点很好理解,现在来解释一下第一点:如果当前这个人不买他最左边人卖的原创 2014-11-24 21:52:06 · 796 阅读 · 0 评论 -
USACO--2.3Zero Sum
一个简单dfs,只是填充符号后的求和写的有点复杂了。/*ID:15674811LANG:C++PROG:zerosum*/#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<cmath>#include<fstream>using namespace std;int n,tm原创 2015-03-23 16:37:11 · 566 阅读 · 0 评论 -
Codeforces 300-A/B/C
A题就是水题,直接按要求分类就行了。#include<iostream>#include<cstdio>#include<cstring>using namespace std;int main(){ int n,cnt1,cnt2,cnt3,a[110]; int b1[110],b2[110],b3[110]; while(scanf("%d",&n)!=EOF)原创 2015-04-02 17:11:32 · 892 阅读 · 0 评论 -
USACO--2.3Controlling Companies+dfs
这个题目的困难之处在于处理间接持股的情况可能有多层,开始的时候我也没想清楚怎么处理这种情况后面参考了别人的想法才写出来的。其实对于间接持股的情况,我们可以在每次遇到直接控制情况时,用dfs将其转化为直接持股的情况,当然如果在dfs过程中遇到股份大于百分之五十的情况时还要继续dfs跟新下去。代码如下:/*ID:15674811LANG:C++PROG:concom*/#include<iost原创 2015-03-24 19:01:00 · 714 阅读 · 0 评论 -
uva--10718+贪心
题意: 输入n,L,U,在L,U之间找一个数M使得n与M按位或的值最大,如果有多个M输出最小的那个。思路: 将数化成二进制再结合或的性质就可以很容易得到一个贪心的策略:将n化为32位的二进制表示后对于n中为0的位,使得M对应的二进制位为1.这样显然可以使得n|M值最大,但是同时还要考虑区间的限制;n中二进制为0时,M对应的二进制位取1的条件是:必须保证后面M的最小值小原创 2014-11-23 17:57:16 · 849 阅读 · 0 评论 -
uva--10954+贪心
题意: 输入n个数将它们相加。相加的时候每次只能选择2个数,然后定义这两个数的和为这一次相加的代价。问以什么顺序相加可以使得总的代价最小。思路: 从n个数中选2个数相加后然后问题就变成了n-1个数相加了,所以我们可以采取的一个贪心策略是每次都选两个最小的数相加。具体实现的时候可以先对n个数排一下序,然后取前2个数相加,再将结果插入到原数组中(这是插入排序的思想,其实原创 2014-11-21 13:04:28 · 887 阅读 · 0 评论 -
uva--714+二分(最大值最小化问题)
题意: 原题意比较啰嗦,大概的意思就是输入n个整数,然后将他们分成m段,要求求出这m段中最大和最小时候的情况。输出的时候段与段之间用"/"分离,当有多个解时,输出第一段值最小的,第一段相同时输出第二段值最小的解,以此类推。思路: 一看到最大值最小,我就想到了二分,可以采取二分试探这个最大值,然后看是否能在这个最大值下能否分成m段,然后我们记录下二分过程中得到的那个满足要求原创 2014-11-21 23:48:46 · 858 阅读 · 0 评论 -
uva--10098--Generating Fast, Sorted Permutation
这是一道关于排列的题,主要是生成给定序列的所有全排列另外好像要按字典序输出我的思路:先是调用快排将给定的序列排序,然后直接调用了C++STL中的next_permutatiion()函数;这样做代码简单但时间费得比较多,看了一下大神用小白书上的dfs写的代码,效率高了很多倍//对于next_permutation()函数//对于当前的序列如果不是最后一个序列则原创 2014-06-07 23:21:46 · 848 阅读 · 0 评论 -
uva--10706+递推
题意: 给定一个形如原创 2014-11-17 17:15:46 · 499 阅读 · 0 评论 -
uva--10026+贪心
题意: 一个鞋匠要做n双鞋,每一双鞋需要花费的时间是t;鞋匠每天只能做一双鞋,如果一双鞋没有按时完成,则每耽误罚款s。现在依次输入n双鞋所需要的时间和罚款,求一个罚款最小的安排。思路: 开始觉得可以将罚款多的放在前面做,但后面发现这种贪心策略是不正确的。后面考虑了一下,可以按每双鞋s/t从大到小进行一个排序如果值相同则编号小的放前面(因为他要求输出最小字典序的答案原创 2014-11-19 14:20:15 · 639 阅读 · 0 评论 -
uva--311+贪心
题意: 货物和箱子是等高的,然后货物的尺寸有1×1,2×2.。。。。6×6六种,箱子的尺寸统一是6*6的。给定6种货物每种的数量,然后求将它们全部装箱所需要的最小箱子数。思路: 显然要想箱子数最小,就要尽量把每个箱子都装满,那么我们可以每个箱子都选择先装大的,然后再填充小大(因为装了大的可以填充小的,而装了小的确不一定能再装进大的了)。 具体的:每个6*6的货物肯定要原创 2014-11-20 00:06:55 · 629 阅读 · 0 评论 -
uva---10020+贪心
区间覆盖问题,刘汝佳小白书P154页有详细思路;代码如下:#include#include#include#includeusing namespace std;typedef struct{ int x,y;}P;P p[110000];int cmp(P p1,P p2){ if(p1.x==p2.x)原创 2014-11-20 11:58:29 · 912 阅读 · 0 评论 -
uva--10670Work Reduction +模拟
题意: 现在有n份工作需要做,老板要求必须一天之内做到只剩m份;你可以选择一些机构来帮你完成工作,他们的收费标准是:收费$A完成一份工作,收费$B完成你一半的工作(如果除2后有小数,则四舍五入)。输入L个这样机构的收费,你需要算出完成你工作每个机构最低的收费,并且从低到高排序后输出(费用相同,则按机构名的字典序排序)。思路: 如果剩余工作完成一半后仍大于m,我们就选择完成一原创 2014-11-25 18:51:57 · 715 阅读 · 0 评论 -
uva--10714+找规律
题意: 一根长度为len的木棍上有n只蚂蚁,蚂蚁们都以1cm/s的速度爬行;如果一只蚂蚁爬到了木棍的端点,那么他就会掉下去;如果两只蚂蚁碰到一起了,他们就会掉头往相反方向爬行。输入len和n只蚂蚁的初始位置(以左端点为原点),问:所有蚂蚁都掉下木棍的最短时间和最长时间(蚂蚁初始爬行方向是不定的)。思路: 最短时间是很显然的,只要靠近左端点的蚂蚁都往左端点爬,靠近右端点的蚂蚁原创 2014-11-20 20:26:36 · 1273 阅读 · 0 评论 -
uva--10716Evil Straw Warts Live +回文串+贪心
题意: 输入一个字符串,我们可以交换这个字符串中的相邻字符;问至少经过多少步交换可以得到一个回文串;如果无论怎么交换都得不到回文串,输出“Impossible”;思路: 首先由回文串的定义和性质,可以得到两种不可能情况:1.当这个串长度为奇数时,如果出现次数为奇数次字母的数目不为1,则显然不可能。2.当这个串长度为偶数时,如果出现次数为奇数次字母的个数大于0,则不可能。原创 2014-11-26 18:46:08 · 1120 阅读 · 0 评论 -
UVALive 3882--And Then There Was One+约瑟夫环问题变形
题目链接:点击进入 题目意思大概和约瑟夫环问题差不多,唯一的不同点在于起点改成了m;刚开始的时候我想直接链表模拟算了,但是后面一看,数据太大,就改用公式做了。约瑟夫环的公式是:f(n)=(f(n-1)+k)%n ,对于这个题起点为m,所以答案就会变成ans=(f(n)+m-k+1)%n; ans有可能小于0,此时我们要给他加上一个n,ans+=n。代码如下:#include<iostream>原创 2015-07-16 11:01:04 · 898 阅读 · 0 评论