2012年5月2日
摘要: URAL_1029 dp。#include<stdio.h>#include<string.h>#define MAXN 110#define MAXM 510int N, M, a[MAXN][MAXM], p[MAXN][MAXM];long long f[MAXN][MAXM];void init(){ int i, j; for(i = 1; i <= N; i ++) for(j = 1; j <= M; j ++) scanf("%d", &a[i][j]);}void dfs(int x, int y){ if(p[ 阅读全文
posted @ 2012-05-02 21:55 Staginner 阅读(249) 评论(0) 推荐(0) 编辑
摘要: URAL_1028 将点排序后依次插入线段树,就可以将计算星星等级转化成区间求和的问题了,于是用线段树支持单点修改和区间求和即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 15010#define MAXX 32010struct Point{ int x, y;}p[MAXD];const int D = 32000;int N, num[4 * MAXX], h[MAXD];int cmp(const void *_p, const void *_q){ Point 阅读全文
posted @ 2012-05-02 21:29 Staginner 阅读(286) 评论(0) 推荐(0) 编辑
摘要: URAL_1027 可以将若干种状态用整数标记一下,然后依次扫描一遍text的字符,如果在当前状态下满足某些条件就跳转到下一状态,如果跳入到了非法状态就可以直接break了,最后看扫描完text之后是否处于一个正常的状态即可。#include<stdio.h>#include<string.h>#define MAXD 10010int N;char b[MAXD], *ch = "=+-*/0123456789";void change(int &i, int &pat, int &pre){ if(pat == 0) { 阅读全文
posted @ 2012-05-02 21:10 Staginner 阅读(290) 评论(0) 推荐(0) 编辑
摘要: URAL_1026 排个序即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 100010int N, K, a[MAXD];char b[MAXD];int cmp(const void *_p, const void *_q){ int *p = (int *)_p, *q = (int *)_q; return *p < *q ? -1 : 1;}void init(){ int i; for(i = 1; i <= N; i ++) scanf(&quo 阅读全文
posted @ 2012-05-02 17:40 Staginner 阅读(152) 评论(0) 推荐(0) 编辑
摘要: URAL_1025 排个序扫描一下即可。#include<stdio.h>#include<string.h>#include<stdlib.h>#define MAXD 110int K, a[MAXD];int cmp(const void *_p, const void *_q){ int *p = (int *)_p, *q = (int *)_q; return *p < *q ? -1 : 1;}void init(){ int i; for(i = 0; i < K; i ++) scanf("%d", & 阅读全文
posted @ 2012-05-02 17:32 Staginner 阅读(363) 评论(0) 推荐(0) 编辑
摘要: URAL_1024 实际上就是去求若干循环节的最小公倍数,题目中说明了数据会保证最后结果不大于10^9,不过超int的情况还是很好构造出来的,让循环节长度分别等于一连串的素数即可。#include<stdio.h>#include<string.h>#define MAXD 1010int N, P[MAXD], vis[MAXD];int gcd(int x, int y){ return y == 0 ? x : gcd(y, x % y);}void solve(){ int i, j, k, cnt, ans = 1; for(i = 1; i <= N; 阅读全文
posted @ 2012-05-02 17:22 Staginner 阅读(192) 评论(0) 推荐(0) 编辑
摘要: URAL_1023 如果用SG函数去分析的话,那么就是要求初始位置的SG函数值为0,对于给定一个L简单分析一下各个位置的SG函数值的情况,不难发现如果K是L+1的倍数,那么就能保证初始位置的SG函数值为0,这样就将问题化归成了找K的最小质因子。 这个题目是不存在无解的情况的,因为L=K-1一定可以保证胜利,但并不一定是最优的。 需要注意的是L要>=2,也就是L+1要>=3,所以在找质因子的时候要排除2。如果是预先筛出10000以内的素数再进行判断的话,就要注意K是2乘某个素数时的情况,这个素数就要作为L+1。#include<stdio.h>#include<st 阅读全文
posted @ 2012-05-02 16:33 Staginner 阅读(157) 评论(0) 推荐(0) 编辑
摘要: URAL_1022 拓扑排序。#include<stdio.h>#include<string.h>#define MAXD 110#define MAXM 10010int N, cnt, e, first[MAXD], next[MAXM], v[MAXM], topo[MAXD], vis[MAXD];void add(int x, int y){ v[e] = y; next[e] = first[x], first[x] = e ++;}void init(){ int i, j, k; memset(first, -1, sizeof(first)); .. 阅读全文
posted @ 2012-05-02 13:24 Staginner 阅读(399) 评论(0) 推荐(0) 编辑
摘要: URAL_1021 可以将问题等效成对于x查找10000-x是否在列表中出现过,二分、哈希等都可以。#include<stdio.h>#include<string.h>#define D 33000#define MAXD 66000#define MIN -32768#define MAX 32767int N, h[MAXD];void init(){ int i, k; memset(h, 0, sizeof(h)); for(i = 0; i < N; i ++) { scanf("%d", &k); h[D + k] = 1 阅读全文
posted @ 2012-05-02 13:06 Staginner 阅读(423) 评论(0) 推荐(0) 编辑
摘要: URAL_1020 实际上圆弧部分能够组成一个圆,而直线部分则分别等于各相邻两点间距离。#include<stdio.h>#include<string.h>#include<math.h>#define MAXD 110int N;double R;const double pi = acos(-1.0);struct Point{ double x, y;}p[MAXD];void init(){ int i; for(i = 0; i < N; i ++) scanf("%lf%lf", &p[i].x, &p 阅读全文
posted @ 2012-05-02 12:59 Staginner 阅读(171) 评论(0) 推荐(0) 编辑