上一页 1 ··· 54 55 56 57 58 59 60 61 62 ··· 85 下一页
  2011年12月12日
摘要: UVA_10056 这个题目公式还是比较好推的,至于精度的问题,对于只需要保证大概6位有效数字的除法来讲,double就可以了,只要不超过double的范围就好了。#include<stdio.h>#include<string.h>#include<math.h>int N, I;double P;void solve(){ scanf("%d%lf%d", &N, &P, &I); if(fabs(P) < 1e-9) printf("0.0000\n"); else printf(& 阅读全文
posted @ 2011-12-12 23:05 Staginner 阅读(540) 评论(0) 推荐(0) 编辑
摘要: UVA_11027 首先如果要组成回文串,最多只能有一种字母是奇数个。 然后我们不妨设要找第N个回文串,那么自然先挑字典序最小的一对放在两端,这样算一下这种情况一共有p种,如果p<N,说明当前应该放字典序更大一点的,于是我们令N=N-p,然后再尝试下一种方法。 这样如果第一位尝试了所有的情况都始终没有p>N的话,就说明一共都没有N个这么多的回文串,自然就输出XXX,但放第一位的时候如果某刻出现p>=N的话,那么便必然有解。于是再按照上面的方法递归去安排后续中间的回文串即可,同时这时也可以开始打印方案了,因为必然有解。 当然,也要注意一下只有一个字符的情况。#include&l 阅读全文
posted @ 2011-12-12 22:06 Staginner 阅读(339) 评论(0) 推荐(0) 编辑
摘要: UVA_10375 将组合数化简一下边乘边除即可。#include<stdio.h>#include<string.h>int P, Q, R, S;void solve(){ int i, j, k; double ans = 1.0; if(P - Q < Q) Q = P - Q; if(R - S < S) S = R - S; for(i = 1; i <= S || i <= Q; i ++) { if(i <= Q) ans = ans * (P - Q + i) / i; ... 阅读全文
posted @ 2011-12-12 20:08 Staginner 阅读(402) 评论(0) 推荐(0) 编辑
摘要: UVA_10105 组合题,用了一下LRJ书上递推计算组合数的方式。#include<stdio.h>#include<string.h>#define MAXD 20int N, K;long long int C(int m, int n){ int i; long long int ans = 1; if(n - m < m) m = n - m; for(i = 1; i <= m; i ++) ans = ans * (n - i + 1) / i; return ans;}void solve(){ int i, j,... 阅读全文
posted @ 2011-12-12 19:51 Staginner 阅读(278) 评论(0) 推荐(0) 编辑
摘要: UVA_10308 由于原图是一棵树,这样我们只要随便指定一个树根就可以画成树的形式,那么所有路径都可以看成以父节点为中转点的“儿子甲+儿子乙”的形式(当然只有一个儿子的处理方式也是一样的),同时我们用dfs遍历树的时候父节点顺便向上返回一个最大的儿子即可。 我在看UVA的论坛的时候,有人说是存在village数为0的情况,并且这种情况用一个空行表示,因此我们不能把所有的空行都当做分割线去处理,但实际上不考虑这种情况直接交也能AC,可能是后来UVA改了数据吧,不过我的程序还是按考虑有这种情况来写的。#include<stdio.h>#include<string.h># 阅读全文
posted @ 2011-12-12 16:54 Staginner 阅读(584) 评论(5) 推荐(0) 编辑
摘要: UVA_10023 今天学了一下手算开平方的算法,其实也没我之前想的那么麻烦,因为懒得敲C++的大数模块,就直接用Java写了。import java.math.BigInteger;import java.util.Scanner;public class Main { public static void solve(BigInteger y) { int i, j; BigInteger x = new BigInteger("0"); String str = "0" + y.toString(); BigIntege... 阅读全文
posted @ 2011-12-12 15:00 Staginner 阅读(573) 评论(0) 推荐(0) 编辑
摘要: UVA_11029 两数乘法的后三位自然是由各自后三位决定的,因此对于后三位我们完全可以用快速幂取模来做,但前三位就不行了。 但对于n^k我们可以做变形10^(k*logn),这样又由于10^x只是改变小数点的位置我们自然就不用去考虑了,因此前3位只取决于10^(2+fmod(k*logn,1)),当输入最后结果的时候,由于要的是精确的前3位,所以应用强制转型忽略掉小数位,而不能直接用%.0f输出。#include<stdio.h>#include<string.h>#include<math.h>int N, K;long long int dfs(int 阅读全文
posted @ 2011-12-12 13:06 Staginner 阅读(439) 评论(0) 推荐(0) 编辑
  2011年12月11日
摘要: UVA_571 一开始没什么思路,后来看了别人的解题报告发现是用类似贪心的方式去做的。 由于这个题目没有限定倒水的次数,所以只要构造出一个可行解就可以,如果我们每次A是空的就加水,不空就向B倒,B满了之后就empty掉,这样在B中一定可以形成0-B的任意一个解。 后来自己简单的证明了一下。按这样去倒水的话,我们可以用(n*A)%B表示B中的水量,由于A与B互质,那么容易得到这个函数的最小周期是B,并且在一个周期内,我们易证明这个函数的值均是不同的,而一个周期内(准确来说要包含两个临界点)n的取值是0-B,那么对应的值也必然会恰好覆盖满0-B,因此这样我们就一定可以得到一个满足要求的操作序... 阅读全文
posted @ 2011-12-11 21:58 Staginner 阅读(274) 评论(0) 推荐(0) 编辑
  2011年12月10日
摘要: UVA_10820 看到题目说打表我就傻呵呵的把表打出来交了,结果超过了代码长度…… 后来看了别人的解题报告发现欧拉函数做就可以了,本来它就是解决n以内和n互质的数的个数的,数学的基础知识还是不牢固啊……#include<stdio.h>#include<string.h>#include<math.h>#define MAXD 50010int N, phi[MAXD], A[MAXD];void prepare(){ int i, j, k; memset(phi, 0, sizeof(phi)); phi[1] = 1; N = 50000; for( 阅读全文
posted @ 2011-12-10 18:23 Staginner 阅读(476) 评论(0) 推荐(0) 编辑
摘要: UVA_10717 枚举桌腿的选择,然后求出最小公倍数之后再进行相应的计算、更新即可。#include<stdio.h>#include<string.h>#define MAXN 60#define MAXT 15int N, T, a[MAXN], t[MAXT];long long int low[MAXT], high[MAXT];long long int gcd(long long int x,long long int y){ return y == 0 ? x : gcd(y, x % y);}int init(){ int i; scanf(" 阅读全文
posted @ 2011-12-10 03:31 Staginner 阅读(311) 评论(0) 推荐(0) 编辑
上一页 1 ··· 54 55 56 57 58 59 60 61 62 ··· 85 下一页