随笔分类 - 题解
题解
摘要:就是暴力搜索,用f[i]为0为1代表是否能够构成着一种,如果能就是1不然就是0,然后代码就出来了:#include <stdio.h>#include <stdlib.h>char f[35001];int main(int argc, char **argv){ int i, j, max = 0; int m, n, a; scanf("%d%d", &m, &n); f[0] = 1; for(i = 1; i <= n; i++){ scanf("%d", &a); for(j = max;
阅读全文
摘要:这题让我学到了一个技术啊,那个什么线段树神马的都是浮云,真的是浮云,查并集才是王道,用好查并集线段树可以秒杀,空间需求更低,效率更高,为什么不用查并集呢!!! f[i]代表i节点所在的集,d[i]代表i距离f[i]之间有多远, 然后更多题解看我转的内容: 初看本题,似乎没有思路,动态规划、贪心、递推等常规方法似乎行不通。但仔细观察题目条件,发现原体实际是告知一部分线段的和,求未知线段的长度。这个问题显然是并查集(注意:与线段树相区分)。 利用一个数组f[i]记录当前位置的父亲,即使用父亲标记法实现并查集。另一个数组d[i]表示当前元素父节点到当前元素的线段长度。显然,位于同一个集合中...
阅读全文
摘要:SPFA,纯搜索,如果走到下一个位置的体力可以更少那就用那个更少的,如果一样多,看走的步数,用少的,就这样一个广搜。 代码如下:#include <math.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#define QMAX 25000struct node{ int x, y;}queue[QMAX];int head, rear;int map[500][500];int used[500][500];void enqueue(int x, int y){ if(use
阅读全文
摘要:这题考的是压缩,当两个石子之间的距离大于100的时候就让他们变成100,然后计算就十分方便了,代码如下:#include <stdio.h>#include <stdlib.h>#define min(a, b) ((a)<(b)?(a):(b))int num[101];int f[10101];int stone[10101];int com(const void *a, const void *b){ return *(int *)a - *(int *)b;}int main(int argc, char **argv){ int i, j, k; int
阅读全文
摘要:这题要先求出矩阵中的第四个点,利用向量,在纸上画一下绕来绕去的就可以得出x=x1+x2-x0. y=y1+y2-y0。因为三个点构成了一个直角三角形,那我就设(x0, y0)90度角的顶点,然后就有上面的那个公式了。嗯,然后就是初始化,再然后就是暴力搜索就是的了。#include <math.h>#include <stdio.h>#include <stdlib.h>int price[100];int x[400], y[400];#define swap(a, b) {int t; t = a; a = b; b = t;}double dis[400
阅读全文
摘要:一个类似于数学公式的公式,嗯,语言无法表达,看代码吧,(估计一会儿还真看不懂。)#include <stdio.h>#include <stdlib.h>int main(int argc, char **argv){ int i, j; int k, l, m; int n; scanf("%d", &n); for(i = 1, j = 0; j + i < n; i++){ j += i; } k = (i & 1) ? i : 1; l = (i & 1) ? -1 : 1 ; m = i; for(i = j
阅读全文
摘要:纯水题,最上面一行去掉,最下面一行去掉,在剩下的(n - 1) * (n - 1)的矩形里面,长度为一的进制数的出现次数减一就是代表几,比如样例吧:5+ L K V EL L K V EK K V E KLV V E KL KKE E KL KK KV 上面,红色的L出现了一次,就代表0,K出现两次就代表1,两位数都不考虑,就这样的:#include <stdio.h>#include <string.h>#include <stdlib.h>char tmp[1000];char str[9];int used[9];int main(int argc,
阅读全文
摘要:SPFA,直接搜索就行,代码如下:#include <stdio.h>#include <stdlib.h>#define Q_MAX 100000char map[1000][1000];int dis[1000][1000];struct node{ int x, y;}queue[Q_MAX];int head, rear;int used[1000][1000];void enqueue(int a, int b){ if(used[a][b]){ return; } used[a][b] = 1; queue[rear].x = a; queue[rear].
阅读全文
摘要:树形动态规划,第一次接触这样的树形动态规划,应该说是彻底的,以前的那个什么没有上司的舞会都是小儿科,嗯,思路见网上同类报告(偷懒) 代码:#include <stdio.h>#include <string.h>#include <stdlib.h>int num[1001];struct node{ int left, right; int sum;}tree[1001];int f[1002][102];int m, n;int srch(int root, int count){ int i; int t; if(f[root][count] != 0
阅读全文
摘要:f[i][j] = min{max{f[k - 1][j], f[i - k][j - 1]} + 1}; 然后因为最多1000,2^10=1024所以超过10个蛋都没用了,所以就if(m > 10){m = 10;} 代码:#include <stdio.h>#include <string.h>#include <stdlib.h>#define max(a, b) ((a)>(b)?(a):(b))int f[1001][1001];void deal(int m, int n){ int t, s; int i, j, k; if(m &
阅读全文
摘要:转解题报告:http://hi.baidu.com/1996102129/blog/item/6e6fcd50853bb814367abec1.html/cmtid/a69829e65dc5e920b93820fd 我觉得这题的难点是彻底读懂题目,确实难读懂。实话。 我的代码如下:#include <stdio.h>#include <stdlib.h>#define max(a, b) ((a)>(b)?(a):(b))int coin[1001][1001], sum[1001][1001];int cost[1001], f[1001];int main(i
阅读全文
摘要:这题我还是没看太懂,准确的说是不知道方程是不是正确的,但是隐隐约约感觉又是对的额,嗯……题解的网站发上来吧,你们自己看去吧。 http://hi.baidu.com/greeeeeeen/blog/item/9ae3b0fa52241d939f51468c.html 代码如下:#include <stdio.h>#include <stdlib.h>int t[5001], f[5001];int c[5001];int main(int argc, char **argv){ int i, j; int n, s; int a, b; scanf("%d%d
阅读全文
摘要:嗯,看网上的题解吧,我推荐一个,觉得不错的,不贴上来了,直接放地址:http://hi.baidu.com/qq953892596/blog/item/4c17eb807c98c8b20cf4d202.html 代码:#include <stdio.h>#include <stdlib.h>#define min(a, b) ((a)<(b)?(a):(b))int left[1001][1001], right[1001][1001];int w[1001][1001];struct girl{ int d, w;}girls[1001];int n;void
阅读全文
摘要:直接搜就是了,一个点向根出发,到的每个都记录一下,然后另一个点再搜,第一个被标记的就是了。#include <stdio.h>#include <stdlib.h>int p[1000001];int time[1000001];void srch(int i){ while(i != 1){ time[i] = 1; i = p[i]; } time[i] = 1;}int main(int argc, char **argv){ int i, n; int a, b; scanf("%d", &n); for(i = 1; i <
阅读全文
摘要:嗯,我练习了下二叉堆,代码写得挺长的,其实题目比较简单,就是贪心就行…… 嗯,上代码吧:#include <math.h>#include <stdio.h>#include <stdlib.h>#define left(i) (((i) << 1) + 1)#define right(i) (((i) << 1) + 2)#define parent(i) (((i) - 1) >> 1)struct node{ int x, y, v;}heap[400];int end;int n, m;void insert(in
阅读全文
摘要:怎么说呢,都说是全排列,但是我不会(等会儿看看),康拓排序我觉得用不了,因为太大了,long long都装不下,但是m的范围又小,所以可以直接枚举,代码如下:#include <stdio.h>#include <stdlib.h>int num[10000];int used[10001];int m, n;int t;void output(void){ int i; for(i = 0; i < n; i++){ if(i != 0){ printf(" "); } printf("%d", num[i]); } pr
阅读全文
摘要:看到一个很好的结题报告,转一下:http://zhurui250.blog.163.com/blog/static/13727052020115273939197/【分析】数学推论题,我列一下站数 1 2 3 4 5 6 …… N上车人数 A F A+F A+2F 2A+3F 3A+5F …… 0下车人数 0 F F A+F A+2F 2A+3F …… M总人数 A A 2A 2A+F 3A+2F 4A+4F …… 0代码:#include <stdio.h>#include <stdlib.h>struct post{ int a, x;}s1[21], s2[21]
阅读全文
摘要:虽说是普及组,还是不好处理啊!想了好久,最后决定使用一个栈来维护所有的枚举,总的来说我这里算是用了两个栈(因为BFS本身就能算一个栈),这个题目真的有挑战性啊,算法没什么,但是规律方面的东西好重要饿。。。。 不说了,代码:#include <stdio.h>#include <stdlib.h>int flag = 0;int stack[100000];int top;void push(int k){ stack[top++] = k;}int pop(void){ return stack[--top];}void output(int k){ int i, j;
阅读全文
摘要:我直接模拟的,第i个数字必定大于或等于第i-1个数字,我是按照这种思想模拟的,那么每种情况就只会考虑一次,然后需要一个重大剪枝: 当i=k-1的时候,就不去枚举了,直接得到答案,用n-sum,我还有一个小剪枝,因为我的第i个数一定大于或等于第i-1个数,那么如果第i个数加到第k个数就大于n的话,就没必要继续枚举了。 2011年08月29日: 刚刚发现,上次的代码有问题,数据太弱,所以过了,但是2 15 151,2 151 15的答案不一样,思索了好久,最后想出了正确的算法。 就是枚举两个字符串,如果相同就继续枚举,不同就继续枚举。。。。。(没听懂的看下面第二段代码,第一段只...
阅读全文
摘要:裸搜索,然后处理下范围就行,代码如下:#include <stdio.h>#include <string.h>#include <stdlib.h>char middle[9], last[9];void srch(int m_s, int m_e, int l_s, int l_e){ int i; for(i = m_s; i <= m_e; i++){ if(middle[i] == last[l_e]){ break; } } printf("%c", last[l_e]); if(m_s != i){ srch(m_s,
阅读全文
浙公网安备 33010602011771号