上一页 1 ··· 70 71 72 73 74 75 76 77 78 ··· 85 下一页
  2011年9月29日
摘要: UVA_10034 首先根据点的坐标把所有边构造出来,然后直接用Kruskal算法求出最小生成树即可。具体思想可以参考刘汝佳白书的P201。#include<stdio.h>#include<string.h>#include<math.h>#include<stdlib.h>double x[110],y[110],w[10010];int u[10010],v[10010],p[110],r[10010];int cmp(const void *_p,const void *_q){ int *p=(int *)_p; int *q=(int 阅读全文
posted @ 2011-09-29 15:57 Staginner 阅读(400) 评论(0) 推荐(0) 编辑
摘要: UVA_567 由于最后查询的情况比较多,所以我们采用“一劳永逸”的floyd算法,直接算出任意两点间的最短路即可。#include<stdio.h>#include<string.h>int f[30][30];int main(){ int i,j,k,n,u,v,t; t=0; while(scanf("%d",&n)==1) { for(i=1;i<=20;i++) for(j=1;j<=20;j++) { if(i==j) f[i][j... 阅读全文
posted @ 2011-09-29 13:08 Staginner 阅读(292) 评论(0) 推荐(0) 编辑
  2011年9月28日
摘要: UVA_507这个题目实际上就是在求一个最大子串和。由于具有最大和的子串是具有这样的性质的,第一项不为负,并且,从第一项开始累加,中间不会有中间结果为负。因为一旦中间结果为负,我们是可以抛弃前半段的,因此就矛盾了。然后我们便根据这个特征去寻找具有最大和的子串即可。#include<stdio.h>#include<string.h>int main(){ int i,j,k,t,n,tt,x,y,tx,sum,ans; scanf("%d",&t); for(tt=0;tt<t;tt++) { scanf("%d", 阅读全文
posted @ 2011-09-28 22:40 Staginner 阅读(385) 评论(0) 推荐(0) 编辑
摘要: UVA_10827 由于矩形上下左右是相接的,所以我们不妨先在图的右、下、右下分别补上三个完整矩形,然后枚举矩形的左上角位置。由于数据量比较大,所以我们需要不断利用已经计算过的结果,这也是动态规划的基本思想之一。#include<stdio.h>#include<string.h>int a[200][200],b[200],c[200];int main(){ int i,j,k,t,n,x,y,ans; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i 阅读全文
posted @ 2011-09-28 22:08 Staginner 阅读(523) 评论(0) 推荐(0) 编辑
摘要: UVA_10720这个题目做的时候有点贪心的味道,就是如果一个点的度很多的话,那么它应该优先和度比较多的点连成边。一开始估算了下qsort的时间,觉得麻烦了,但后来老大说他之前就是用qsort过的,于是我便才开始写起qsort来。可能是因为剪枝用的比较得当或者题目的数据比较少才不致以超时吧。#include<stdio.h>#include<string.h>#include<stdlib.h>int a[10010],n,N,sum;int cmp(const void *_p,const void *_q){ int *p=(int *)_p; int 阅读全文
posted @ 2011-09-28 20:36 Staginner 阅读(470) 评论(0) 推荐(0) 编辑
  2011年9月27日
摘要: UVA_993首先我们考虑,什么情况下会是-1?显然是当x不能分解成10以内素数乘积的时候,那么我们直接把x分解素数然后依次输出就可以了吗?也不行。至于为什么不行,我们不妨想一下怎么保证最后的数最小。首先,要数最小,肯定是先输出小的数字再输出大的,其次,我们也要保证数字的个数尽可能少,而且我们要优先去保证这一点。想到这里,我们不妨看一下10以内的数:2、3、4、5、6、7、8、9,其中8可以兼并3个2,于是我们先要看x包含几个8,其次,4、6、9都能兼并两个数,而且他们最大能兼并的数字之和是一定的,不会因兼并策略的改变而改变,但是为了保证小的数字更多,我们便要先考虑4,再考虑6,最后考虑9。剩 阅读全文
posted @ 2011-09-27 12:33 Staginner 阅读(328) 评论(0) 推荐(0) 编辑
摘要: UVA_10706首先我们可以把这串数中的通项摘出来,就是12345……(n-1)n,这串数就是由这个通项依次拼接而成的。意识到上面一点后,我们不妨把原序列的第i位转化成是哪一通项中的哪一位,这样我们不就好处理多了么。要能够实现这样的转化,我们需要知道两组数据,第一,每个通项中有多少个数字,第二,根据第一组数据算出从第一项开始至第n项一共有多数字。这样我们就可以算出第i位是在第n+1项中的i-sum[n]项,其中sum[]代表的就是第二组数据。在算这两组数据的时候我们采用递推的方式去计算,而且我们只要把最大的情况算出来并保留中间结果即可(也即打表),这样就避免了重复计算。下面的问题就是最大情况 阅读全文
posted @ 2011-09-27 11:31 Staginner 阅读(1032) 评论(4) 推荐(0) 编辑
  2011年9月26日
摘要: HDU_1879 如果道路已建,就直接应用并查集,如果未建,就把边储存起来。最后再应用一次Kruskal算法求最小生成树即可。#include<stdio.h>#include<string.h>#include<stdlib.h>int p[110],u[10010],v[10010],w[10010],r[10010];int find(int x){ return p[x]==x?x:(p[x]=find(p[x])); }int cmp(const void *_p,const void *_q){ int *p=(int *)_p; int *q= 阅读全文
posted @ 2011-09-26 23:27 Staginner 阅读(298) 评论(0) 推荐(0) 编辑
摘要: HDU_1532 这是一个比较基础的网络流的题目,好长时间没有写过网络流了,一开始把cap[v][u]赋成了-cap[u][v],导致WA了好多次,看来是和最小费用最大流的cost[v][u]=-cost[u][v]搞混了。#include<stdio.h>#include<string.h>int cap[210][210],flow[210][210];int q[210],p[210],a[210];int main(){ int i,j,k,N,M,u,v,front,rear; long long int ans; while(scanf("%d%d 阅读全文
posted @ 2011-09-26 21:25 Staginner 阅读(423) 评论(0) 推荐(1) 编辑
摘要: HDU_2027 直接应用字符串的哈希即可,每成功插入一个单词,计数增加1。#include<stdio.h>#include<string.h>#include<ctype.h>int head[1000003],next[1000];char b[1000],st[1000][100];int hash(char *str){ int seed=31,v=0; while(*str) v=v*seed+*(str++); return (v&0x7FFFFFFF)%1000003;}int insert(int s){ int i,h; h=ha 阅读全文
posted @ 2011-09-26 20:15 Staginner 阅读(462) 评论(0) 推荐(0) 编辑
上一页 1 ··· 70 71 72 73 74 75 76 77 78 ··· 85 下一页