2011年12月9日
摘要: SGU_103 与一般的最短路问题不同的是,我们要首先判断什么时候才可以走上某条路,因此我们需要计算从当前这刻起两个灯变成相同颜色的最近的那一时刻,当然也有可能两灯根本不会变成相同的颜色,总体的一个思想就是如果两灯的一个最小公周期内没有出现相同的颜色,那么后面也一定不会出现相同的颜色。 在计算等待时间的时候,可以依次枚举也可以一次性加到两灯有其一变化的最近的那一刻。在计算最短路的过程中,也可以适当用一些剪枝以减少计算量,比如如果d[u]+t[i]>=d[v],即就算现在立刻可以上路也不能更新d[v],那么自然就不用计算两个灯在什么候会变成相同颜色了,同时如果枚举过程中当前时刻已经超过了d 阅读全文
posted @ 2011-12-09 22:13 Staginner 阅读(393) 评论(0) 推荐(0) 编辑
摘要: UVA_106 继续积累数学知识,这个题目需要用到勾股数的产生公式a=m^2-n^2,b=2*m*n,c=m^2+n^2,枚举m和n就可以求出所有<=N的互质的勾股数,然后把他们的<=N的倍数都删去,剩下的数就是不属于任何一组<=N的勾股数的数字。#include<stdio.h>#include<string.h>#include<math.h>#define MAXD 1000010int N, f[MAXD];int gcd(int a, int b){ return b == 0 ? a : gcd(b, a % b);}void 阅读全文
posted @ 2011-12-09 21:30 Staginner 阅读(346) 评论(0) 推荐(0) 编辑
摘要: SGU_102 一开始直接用gcd暴力也能过,后来看了别人的解题报告发现可以用欧拉函数,以前用过一次但现在忘记了,于是又学了一遍。#include<stdio.h>#include<string.h>#include<math.h>int N;void solve(){ int i, j, k = (int)sqrt(N + 1), res = N; for(i = 2; i <= k; i ++) if(N % i == 0) { res = res / i * (i - 1); while(N % i =... 阅读全文
posted @ 2011-12-09 19:09 Staginner 阅读(175) 评论(0) 推荐(0) 编辑
摘要: SGU_101 这个可以把骨牌看成一条边,把数字看成点,这样最后实际上就是去求一条欧拉道路。 对于无向图欧拉道路要求:①图必须连通;②度数为奇数的点没有或者只有两个。 不符合上述要求自然就无解了,如果有解选一个度数为奇数的点(如果没有就任取一个点)用dfs遍历一遍图把欧拉道路打印出来即可。#include<stdio.h>#include<string.h>#define MAXD 10#define MAXM 210int N, e, first[MAXD], next[MAXM], v[MAXM], p[MAXD], dgr[MAXD], vis[MAXM];int 阅读全文
posted @ 2011-12-09 17:58 Staginner 阅读(327) 评论(0) 推荐(0) 编辑
摘要: UVA_128 模运算。#include<stdio.h>#include<string.h>#define MAXD 1200int a[5], g = 34943;char b[MAXD], *str = "0123456789ABCDEF";void solve(){ int i; long long int k, res; k = 0; for(i = 0; b[i]; i ++) k = (b[i] + k * 256) % g; res = (g - (k * 65536) % g) % g; for(i = 0; i < 4; i 阅读全文
posted @ 2011-12-09 13:43 Staginner 阅读(210) 评论(0) 推荐(0) 编辑