摘要:
UVA_10714 两个蚂蚁碰撞后反向和两个蚂蚁擦身而过继续前行是等价的。#include<stdio.h>#include<string.h>int main(){ int i,j,k,len,t,n,tt,max,min; scanf("%d",&t); for(tt=0;tt<t;tt++) { scanf("%d%d",&len,&n); max=min=0; for(i=0;i<n;i++) { scanf("%d",&k); k=k<(len-k)? 阅读全文
摘要:
UVA_10041这个题目是一个贪心的题目。如果设按升序排列的si的数组为s[],那么Vito的位置一定为s[(r-1)/2]。对于这一点,我们分两种情况进行讨论:①如果si的数量为奇数,那么Vito的位置一定取数组s[]中间的那个值s[(r-1)/2]。因为如果周围的值和s[(r-1)/2]相同的话,Vito的位置左右移动不会产生影响,但如果周围的某个值s[i]不和s[(r-1)/2]相同,倘若Vito的位置移到了这个值上面,可以计算得出,总距离至少增加了abs(s[i]-s[(r-1)/2])(如果s[i]不和s[(r-1)/2]紧邻的话,会增加的更多)。 ②如果si的数量为偶数,那么Vi 阅读全文
摘要:
UVA_10340 这个题目只要依次查找s中的字符是否按顺序在t中出现过即可,此外,这个题目如果s和t完全相同的话,也要输出Yes,尽管这样貌似算是没加密过……但毕竟没和题意产生冲突。#include<stdio.h>#include<string.h>char s[100000],t[100000];int main(){ int i,j,k1,k2; while(scanf("%s%s",s,t)==2) { k1=strlen(s); k2=strlen(t); if(k1>=k2) { pr... 阅读全文
摘要:
UVA_10026这个是一个贪心的题目首先按照fine/time降序排列,值相同的再按序号升序排列。对于为什么贪心策略是这个样子的,我们不妨拿相邻的两个事件a、b来说明一下。由于a、b之后的事件是固定的,所以我们无论排成ab还是排成ba后面部分的损失都是固定的,那么损失的差别主要来源于究竟是排成ab还是排b成a。排ab的损失为ta*fb,排ba的损失为tb*fa,那么如果ta*fb<tb*fa,我们就排成ab,这样可以得到fa/ta>fb/tb,推而广之,就得到了我们的贪心策略。#include<stdio.h>#include<string.h>#incl 阅读全文
摘要:
UVA_10341 由于函数在指定定义域内是单调的,所以直接二分答案即可。#include<stdio.h>#include<math.h>#include<stdlib.h>double p,q,r,s,t,u;double f(double x){ double temp; temp=p*exp(-x)+q*sin(x)+r*cos(x)+s*tan(x)+t*x*x+u; return temp;}int main(){ int i; double max,min,mid; while(scanf("%lf%lf%lf%lf%l... 阅读全文
摘要:
UVA_10763这个题目可以把交换生的u->v看做一条有向边,然后用邻接表把所有的边及其反向边存下来,并且保证邻接表中没有重复的边。这时用一个num[]数组来存储该边的数量,并且每出现一条与之相同的正向边num[]的值自加1,每出现一条与之相反的反向边,num[]的值自减1。最后统计邻接表中num的值是否全为0,如果全为0就输出YES,否则就输出NO。另外,之所以选用邻接表,是怕题目中存在国家表示的数字很大(比如500000)的情况,后来发现最大的数字不超过1000,于是便又改用邻接矩阵存边了,这样在插入边时要比邻接表要快得多,代码复杂度也降低了很多。#include<stdio 阅读全文
摘要:
UVA_10905 这个题实际上也是个排序的题目,只不过排序的标准比较特殊,但有一点是不变的,如果任意局部是有序的,那么全局一定是有序的。所以我们只要把qsort函数中的cmp函数的“排序规则”给改写一下就可以了,即对任意两个数a、b来说,如果ab大于ba,那么在最大值中a一定在b的前面,而对于ab与ba的比较,由于长度相同,只要调用一下strcmp就可以了。由于输入数据里面有比较大的数,所以数组还要开大一点。#include<stdio.h>#include<string.h>#include<stdlib.h>char b[60][500];char t 阅读全文
摘要:
HDU_3683这个题目由于情况不多,所以可以直接枚举,只不过枚举的时候需要注意一些细节。枚举顺序如下:①判断我们1步是否能赢。②判断我们2步是否会输。实际上如果第2步会输,那么就相当于在当前棋盘状态下,对方至少有2个地方可以在落子后连5。 ③判断我们3步是否会赢。在这里需要讨论一下,如果轮到③就说明我们在②的时候得到了两种情况,对方有1个地方可以在落子后连5,或者没有这样的地方。如果有1个地方可以落子连5,那么这一步我们必须走这个位置,如果没有这样的位置,我们这步就可以随意落子。枚举我们的落子位置之后再判断一下对方2步是否会输即可(相当于又进行了一次②,只不过这时的对象由我们变成了对方)。# 阅读全文
摘要:
UVA_10624 由于一开始直接回溯超时了,所以对部分数据进行了打表。#include<stdio.h>#include<string.h>int m,n,a[35];int dfs(int cur){ int i,j,s,c; if(cur==m) return 1; if(cur==0) { if(n==1) { for(i=n;i<10;i+=n) { a[cur]=i; if(dfs(cur+1)) ... 阅读全文
摘要:
UVA_11210一开始觉得这个题目比较麻烦便有点胆怯,后来鼓起勇气开始编之后,发现其实只要把每种情况考虑周全并且回溯得当的话还是不难的。深搜中间之所以把eye设成全局变量并且放在return语句后面进行回溯,是因为我们大体可以把牌分4类,4类中最多只有一个eye,并且如果当前某一类在占用一个eye之后使这一类成为了符合要求的牌,那么这一类不占一个eye的话就一定是不符合要求的(这类牌的张数决定的)。我的程序里面的prepare()函数是可以不用的,当时为了刷排名才刻意加了一个这样的函数。另外,不知道外国人看到刘汝佳的下面这句话时,不知道会不会求助于Google呢…… To who knows 阅读全文