寒假训练
文章平均质量分 60
deepquiet
这个作者很懒,什么都没留下…
展开
-
uva10763
题意:判断交换生是否两两交换,即凡有a-b必有b-a思路:用一个数组存储ab的情况a-b就+1b-a就-1,如果最后有非0的就是不行代码:#include#includeusing namespace std;int g[1000][1000], n;int main() { while(scanf("%d", &n) == 1 && n) { int x原创 2016-03-09 21:56:32 · 353 阅读 · 0 评论 -
Tian Ji -- The Horse Racing
题意:田忌和国王赛马,赢一场得200,输一场失200,平不失不得.思路:wa了一发,因为平局的时候直接让两个互抵,为了让结果最优,应该在平局的时候找到最后一个田忌劣于国王的马与平局的对消,使赢得概率尽量大.代码:#include#include#includeusing namespace std;const int maxn = 1000+5;int a[maxn]原创 2016-02-04 11:29:01 · 325 阅读 · 0 评论 -
Graveyard
题意:在一个周长10000的圆上等距分布n个雕塑,现加入m个,求原先雕塑的最小移动距离思路:如果加入的雕塑是n的倍数,那自然不用移动,如果不是,那就求出间距,从一个旧雕塑出发(至少一个不要动)然后逐个选择移动的最小距离。代码:#include#include#includeconst double len = 10000;int n, m;int main() {原创 2016-02-03 21:01:29 · 401 阅读 · 0 评论 -
Piotr's Ants
题意:一个水平面,给出n只蚂蚁的速度和方向,求一定时间后各蚂蚁的位置和方向思路:蚂蚁相撞后是会掉头的,所以从始至终他们相对的大概位置不会变,那么一开始排在前面的蚂蚁如果没掉下去还是在前面,turing表示正在碰撞,所以用一个order数组存第i号蚂蚁在第几位,最后用after存蚂蚁运动后的状态,由于排过序,所以下标就是第几位,最后依据order逐号求出蚂蚁的状态。#includ原创 2016-02-03 20:52:44 · 351 阅读 · 0 评论 -
All in All
题意:判断给出的序列是不是后一个的子序列思路:逐位比较代码:#include#include#include#includeusing namespace std;string a, b;int main() { while(cin>>a>>b) { int asize = a.size(); int bsize = b.size(); if(asiz原创 2016-02-03 20:25:48 · 359 阅读 · 0 评论 -
Children's Game
题意:将输入的数串连成最大值。思路:直接按照字典集排序是不行的,比如99字典序小于991,但是99991大于99199,所以比较两个串相加后的字典序即可代码:#include#include#include#include#includeusing namespace std;int cmp(string a, string b) { return a+b > b原创 2016-02-03 20:22:58 · 411 阅读 · 0 评论 -
The Trip, 2007
题意:将所有包归为几堆,每堆包大小不重,求最少分堆的方式。思路:既求最少分堆且每个堆没有大小一样的包,那么堆数至少得是最大包重复量,取包时,隔最大重复数绝不会重(排好序后)代码:#include#includeusing namespace std;const int maxn = 10005;int b[maxn];int main() { int n, firs原创 2016-02-03 20:18:55 · 576 阅读 · 0 评论 -
Watering Grass
题意:给出草坪的长宽和各洒水器的射程,求最少的放置数。思路:由于要填满,所以洒水器的射程只能取正方形。在确定的起点范围内取射程最大,然后调整起点。代码:#include#include#includeusing namespace std;double l, w, p, r;double cal() { return sqrt(r*r-w*w/4.0);}原创 2016-02-03 20:11:05 · 398 阅读 · 0 评论 -
DNA Consensus String
题意:找到一个dna序列,使得所有脱氧核糖核酸到给定的脱氧核糖核酸(讲真,输入法自带翻译)变化得最少思路:受中位数思想的影响,觉得就是找到里面的一个脱氧核糖核酸序列,使得其他序列到他的变化对称,可是没法操作。看了题解,发现就是逐位找到出现最多此的那个,代码很简单。不过由于是逐位比较,所以其实是竖着存储的。#include#includeusing namespace std原创 2016-02-03 18:19:48 · 1162 阅读 · 1 评论 -
Building designing
题意:按照绝对值大小从小到大,且必须正负值间隔,问最长序列的长度思路:有flag控制正负间隔,排序是按照绝对值排序代码:#include#include#includeusing namespace std;int a[500005];int cmp(int a, int b) { return abs(a) > abs(b);}int main() { int原创 2016-02-03 18:02:42 · 459 阅读 · 0 评论 -
Slalom
题意:给出每个门起点,高度和横向长度以及滑板的垂直速度,水平速度恒定,求出能取的最快滑板速度.思路:二分确定最快速度,由于门的高低递增,所以检查速度是否可行时从后往前,看通过下个门的高度临界值时是否可以通过门.代码:#include#include#includeusing namespace std;int w, v, n;struct door { double x原创 2016-02-03 17:29:10 · 360 阅读 · 0 评论 -
The Bus Driver Problem
题意:一天之内需有夜班与日班,在不超过d的时长内是没有加班费的,超过每小时r,求最少加班费.思路:最小与最大组合即可.代码:#include#include#includeusing namespace std;const int maxn = 100+5;int day[maxn], night[maxn], n, d, r;int cmp(int a, int原创 2016-02-04 11:33:19 · 284 阅读 · 0 评论 -
WonderTeam
题意:赢得3分,输0分,平1分,求梦之队,即赢球最多,失球最少,进球最多的队的最低排名.思路:主要考虑赢球最多.由于要求的是最低排名,所以最好是赢的最少,输的最多,则取梦之队赢2球,其他队各赢其一球,剩余平局则梦之队: 赢6输n-1平n-3 即 n+3输的队: 赢1输1平2n-4 即2n-1其他: 赢1输0平2n-3 即2n代码:#includeint mai原创 2016-02-04 11:43:51 · 419 阅读 · 0 评论 -
Ugly Windows
题意:求没被覆盖的窗口思路:枚举暴力,遇到没判断过的类型就横向竖向扫描,然后看是否可以补全另外两条,最后还要判断内部是否含有代码:#include#include#includeusing namespace std;const int maxn = 100+10;char win[maxn][maxn];int v[30];int w, l;bool judg原创 2016-02-05 10:54:24 · 344 阅读 · 0 评论 -
Pie
题意:给出人数,蛋糕数,以及各蛋糕的半径,求每个人能平均分到的最大面积思路:也是求最大值,与assemble类似,用到二分取尽量大的匹配代码:#include#include#include#include#include#includeusing namespace std;const double pi=acos(-1.0);int k, f;double原创 2016-02-04 23:34:47 · 295 阅读 · 0 评论 -
Age Sort
题意:给年龄排序思路:用sort会超时,所以是不可行的.由于年龄最大范围可以确定,所以可以用下标记录每个年龄的个数,然后按从小到大输出代码:#include#include#include#includeusing namespace std;int age[110];int main() { int n, a; while(scanf("%d", &n)原创 2016-02-04 23:26:07 · 354 阅读 · 0 评论 -
Help is needed for Dexter
题意:给一个数n, 求最少操作数,使得1-n全变0,一次操作可去多个连续整数同时减去某值思路:取中位数以后的数减去中位数,剩下的数都小于等于中位数,则需操作数最多的即剩下的做大值,即f(n)=f(n/2)+1;代码:#include#includeusing namespace std;int n;int f(int s) { if(s == 1) return 1;原创 2016-02-04 23:12:04 · 314 阅读 · 0 评论 -
Songs
题意:给出n首歌的频率和时长,求fs(i)ls(j)最小.即:b[i]=f[i]*(l[1]+...+l[i]),sum=b[1]+..+b[n],求使sum最小的歌曲排列方式.然后输入碟中位于s的歌,输出歌的id号思路:主要是排序,排序的技巧是a.l*b.f代码:#include#include#include#includeusing namespace std;原创 2016-02-04 17:36:43 · 287 阅读 · 0 评论 -
Supermarket
题意:每个商品都有利润和保质期,在保质期内,能够卖出的最高利润.思路:显然最长时间就是所有商品中的最大保质期,时间自然是递减的,然后利用优先队列取出最大利润的商品.枚举截止时间,商品的保质期在截止时间之后的才能入队,为了保证队内的物品不过期,截止时间应从最长时间递减.代码:#include#include#include#includeusing namespace原创 2016-02-04 17:09:39 · 344 阅读 · 0 评论 -
Fabled Rooks
题目:在给定区域内放车,使得所有车在不同行且不同列(无法互相攻击)思路:这个和processor很像,都是在给定范围内安排事件,所以都用到了优先队列,按照前端点优先.这里要提到由于水平和垂直的位置确定不影响,所以分开确定,即一个车的位置确定分两次.同时用m来控制下个元素的最小放置位置,如果某元素的最远范围小于m显然是不行的。#include#inclu原创 2016-02-03 17:56:13 · 365 阅读 · 0 评论 -
Processor(二分搜索,优先队列)
题意:给出n个任务完成区间以及工作量,求出最快处理速度.思路:用二分搜索匹配最优速度,其中还用到优先队列辅助.枚举所有截止时间,在此时间内的都进队,按照工作截止时间越早越先出队,如果截止时间不及枚举的截止时间,则错过代码:#include#include#include#include#includeusing namespace std;const int N原创 2016-02-03 16:11:37 · 302 阅读 · 0 评论 -
Keep the Customer Satisfied
题意:给出n个任务的耗时和截止时间,求最多可接几单思路:类似的题目这几天都在做,所以很自然想到优先队列,wa了一发,原因是输出之间没有换行先按照截止时间从小到大入队,然后耗时越多的越先出队代码:#include#include#include#include#include#includeusing namespace std;const int maxn = 1原创 2016-02-04 15:47:39 · 356 阅读 · 0 评论 -
Installations
题意:给出n个工作的耗时以及截止时间,每个时刻只完成一样工作,求超时最大的两个任务最少超出时间.思路:一看到截止时间就想到优先队列,后来发现不适用,题目是求最大值最小.首先先按照最早截止时间排序,即截止时间越早优先级越高,如此先求出超时,同时保留罚时最大的值得下标,然后在暴力枚举此下标以前的所有任务,用意在将任务后调,看最大罚时的两个任务罚时是否会有所减少.即将枚举的任务放于第原创 2016-02-04 14:54:52 · 256 阅读 · 0 评论 -
Anagram and Multiplication
题意:给你m, n, 求一个m位n进制的数, 使得这个数乘以2-m得到的结果都是原m位数的一个排序思路:枚举个位数,然后将个位数与2-m相乘的到的值为其他位(一定会出现在串里),主要是位置不确定所以用judge确定是否存在一个可行序列arr存放顺序,将序列遵循n进制乘法乘以2-m,看序列能否满足乘出的数都在num里面,不能满足就换一种序列由于num里面的第i个数就是个位数*原创 2016-02-15 22:49:12 · 408 阅读 · 0 评论 -
Ancient Cipher
题意:判断两个句子能否通过换位与替值得到.只要重复出现的字母的个数相同就行#include#include#include#include#includeusing namespace std;int astr[30], bstr[30];int cmp(int a, int b) { return a > b;}int main() { char a[100原创 2016-01-30 21:24:23 · 238 阅读 · 0 评论 -
Hello World!
题意:输入一个值, 求最小复制次数.思路:#includeint main() { int n, i, kase=0; while(scanf("%d", &n) && n > 0) { for(i=16; (n & (1<<i))==0; i--); int a = 0; if(n > (1<<i)) a = 1; printf("Case %d: %d\n",原创 2016-01-30 21:21:32 · 173 阅读 · 0 评论 -
Colored Cubes
题意:给出n个带颜色的正方体,求改变最少面的颜色使得所有正方体一样思路:以第一个正方体最为基准,通过所有旋转,求出最多重叠面的值#include#include#include#include#include#includeusing namespace std;map color;int cube[5][6], now[5][6];int cnt[25];int原创 2016-02-05 11:30:19 · 294 阅读 · 0 评论 -
Calculator Conundrum
题意:给出位数和一个数,求出在位数内的数的次方的最大值思路:循环控制条件是得到的数已经得到过,即处理数出现循环,则无须再处理了,所以用到了set,用来判断处理数是否出现过那截取位数用到了sstream s > ans, 将字符串转为数字代码:#include#include#includeusing namespace std;int k, n;int next(原创 2016-02-05 15:08:28 · 328 阅读 · 0 评论 -
A Different Task
题意:将汉诺塔从初是状态调到目标状态需要几步思路:步数=从初始状态到标准状态+从目标状态到标准状态+1,标准状态是k(当前最大未排好的盘)上的k-1个盘移到中转柱子,+1是移动第k个盘//后来补的的博客,可能有误/*int f(int n) { return 2*f(n-1)+1;}基础汉诺塔.*/#include#include#define LL long lon原创 2016-02-05 12:00:34 · 252 阅读 · 0 评论 -
Chinese Mahjong
题意:给出13张牌,判断是否听牌思路:一共34种牌,一一枚举,看是否会胡每成一个序列use就加相应个数,如果use可达14个就可胡牌代码:#include #include #include using namespace std; const char* mahjong[] = {"1T", "2T", "3T", "4T", "5T", "6T",原创 2016-02-05 11:40:38 · 399 阅读 · 0 评论 -
Even Parity
题意:将矩阵每个元素的上下左右之数之和调为偶数思路:第一行变化无非2^n种可能,所以枚举第一行,累推出剩余的行累加每个待确定元素上,左,右(如果有的话),然后推出下的值,如果下的值是1且推出的值是0,则不行代码:#include#include#include#include#include#includeusing namespace std;const原创 2016-02-05 11:13:36 · 1203 阅读 · 0 评论 -
Spreading the Wealth
题目:n个人围成一圈,传递现有金额,是所有人平均.思路:对于第一个人, 有A1-x1+x2=average;对于第二个人,有A2-x2+x3=average;其中,x1, x2, x3,为相应的人分配出去的量.那么可以推出:x2 = average-A1+x1=x1-c1,c1=A1-average;x3=average-A2+x2=2average-A1-A2+x原创 2016-01-28 16:06:30 · 284 阅读 · 0 评论 -
Commando War uva11729(贪心)
题意:给部下分配任务,需要交代时间以及完成时间,部下可同时完成任务.思路:先按照执行时间排序,然后枚举所有的任务,用sum累加所有的交代时间,(因为任务可以同时完成,而交代时间不行)然后加上当前需考虑的任务完成时间是否超当前做大值,超过就替换.代码:#include#include#includeusing namespace std;struct node {原创 2016-01-28 15:03:55 · 385 阅读 · 0 评论 -
Dragon of Loowater(贪心)
题意:聘请能力值大于等于恶龙的骑士杀恶龙,按照能力值付金币,使金币尽量少.水题,一键sort.#include#include#includeusing namespace std;int dra[20005];int kni[20005];int n, m;int main() { while(scanf("%d%d", &n, &m) != EOF && n && m) {原创 2016-01-28 14:38:47 · 276 阅读 · 0 评论 -
Distant Galaxy(高效)
题意:给出数点,求一个矩阵,使得落在矩阵边界的点最多.发现博客这种东西,要么立刻马上写,要么立刻马上忘.#老年痴呆患者的怒吼##include#includeusing namespace std;const int maxn = 100+10;struct poin { int x, y; bool operator <(const poin& p)const {原创 2016-01-28 00:59:52 · 600 阅读 · 0 评论 -
Game of Sum(动态规划)
题目:给出一串数组,两人博弈,统计两人拿到的总数,求先手赢对手的最大值.这道题小白上也有,做的时候觉得有做过类似的跑回去找找看,后来发现是一样的.不过第一次做的时候没理解透,觉得样例输出不是最优解,今天才真的明白.#include #include #include #include #include using namespace std;const int MAXN原创 2016-01-28 00:34:06 · 320 阅读 · 0 评论 -
Meteor
题意:给出流星的初始位置和速度,求某个时刻框内流星的数目最多思路:求出流星在框内出现的时间段,然后对各时间段扫描,遇到左端点就累加,遇到右端点表示流星出框,集合交集最多的地方就是所求ps:过了很就以后补的博客,可能有错代码:#include#include#includeusing namespace std;int w, h, n;struct star {原创 2016-02-05 15:32:02 · 250 阅读 · 0 评论 -
Subsequence
题意:求N个整数中相加的S的最少个数思路:a[i]表示前i个数的和,然后枚举终点,当遇到a[j-1]=s时累加j直到i-j最短,记录最小值代码:#include#include#includeusing namespace std;int s, n;int a[100005];int main() { int t; while(scanf("%d%d", &n,原创 2016-02-05 15:45:13 · 331 阅读 · 0 评论 -
Robotruck
题意:求机器人将垃圾扔到垃圾桶的最短距离.思路:主要是基于一个等式:dp[i] = dp[j] + dis[j + 1] +dist[i] - dist[j + 1] + dis[i] ;dp[i]表示扔垃圾的往返时间.那么就是要求:min(dp[j] + dis[j + 1] -dist[j + 1]) +dist[i] + dis[i], 就引出dp[j]+dis[j+1]原创 2016-01-30 00:10:17 · 705 阅读 · 0 评论 -
Placing Lampposts
题意:在一个无向无环图上放置灯盏,保证灯的数量最少的同时被两盏灯照亮的边数尽量大.思路:把被两盏灯照亮的边数尽量大转化成被一盏灯照到的边尽量少,如果有两个需要优化的量v1,v2,要求首先满足v1最少,在v1最少的前提下v2最少,则设一个M,M > max(v2)-min(v2).然后设一个x,使x=Mv1+v2.#include#include#include#inclu原创 2016-01-29 20:07:40 · 378 阅读 · 0 评论