上一页 1 ··· 71 72 73 74 75 76 77 78 79 ··· 85 下一页
  2011年9月26日
摘要: UVA_10057 首先对序列进行升序排序,如果N是奇数的话,那么A只能是中间的那个数,如果N是偶数的话,那么A可以是中间两个数所组成的区间里的任意一个整数。#include<stdio.h>#include<string.h>#include<stdlib.h>int a[1000010];int cmp(const void *_p,const void *_q){ int *p=(int *)_p; int *q=(int *)_q; return *p-*q; }int main(){ int i,j,k,N,n1,n2; while(scanf(& 阅读全文
posted @ 2011-09-26 19:54 Staginner 阅读(631) 评论(0) 推荐(0) 编辑
摘要: UVA_11054 这是一个贪心的题目,我们可以假想第i个人总是与第i+1个人来进行交易来满足i的要求,这样每个人就都是与其最近的人进行交易,从而产生了最优解。#include<stdio.h>#include<string.h>#include<stdlib.h>long long int a[100010];int main(){ int i,j,k,n; long long int sum; while(1) { scanf("%d",&n); if(n==0) break; for(i=0;i<n;... 阅读全文
posted @ 2011-09-26 16:13 Staginner 阅读(340) 评论(0) 推荐(0) 编辑
  2011年9月25日
摘要: HDU_2236为了保证每行每列只取一个元素,我们可以从二分图最大匹配的思想入手,把行和列分别看做二分图左右两部分,i-j的边权就是第i行第j列的元素的值。这样构图之后,求得的二分图最大匹配的4条边就是不在同行或同列的4个元素。有了这个思想时候,我们只需要再保证4个元素中最大值与最小值之差尽量小就可以了,于是我们可以二分枚举最大值与最小值之差,并枚举边权值的下界,如果枚举到某个边权值的下界时该图存在最大匹配,那么就更新max,否则就更新min。#include<stdio.h>#include<string.h>int n,G[110][110],xM[110],yM[ 阅读全文
posted @ 2011-09-25 23:43 Staginner 阅读(457) 评论(1) 推荐(1) 编辑
摘要: HDU_1753 大数加法,固定好小数点的位置,分整数和小数两部分读取和输出即可。#include<stdio.h>#include<string.h>int a[1010],b[1010],sum[1010];char str[1010];int main(){ int i,j,k,p,q,n,s,c; while(scanf("%s",str)==1) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(sum,0,sizeof(sum)); n=strlen... 阅读全文
posted @ 2011-09-25 22:32 Staginner 阅读(275) 评论(0) 推荐(0) 编辑
摘要: HDU_1690 直接用Floyd算法求出任意两点之间的最少花费即可。#include<stdio.h>#include<string.h>#include<stdlib.h>long long int L1,L2,L3,L4,C1,C2,C3,C4;long long int f[110][110],d[110];int main(){ int i,j,k,N,M,t,tt,a,b; long long int temp; scanf("%d",&t); for(tt=0;tt<t;tt++) { scanf(" 阅读全文
posted @ 2011-09-25 22:27 Staginner 阅读(297) 评论(0) 推荐(0) 编辑
摘要: HDU_3329我们可以二分枚举涨水的高度,然后先对外围一层做一次深搜,把所有被淹没的点做上标记,再对没有标记过的点进行深搜,如果深搜后发现有两块或多于两块的土地,那么当前深度的水就是符合要求的,否则就是不符合要求的,之后更改相应的max以及min的值即可。#include<string.h>#include<stdio.h>int a[110][110],vis[110][110];int n,m,max,min,mid;int dx[]={-1,1,0,0},dy[]={0,0,-1,1};void dfs1(int x,int y){ int i,newx,new 阅读全文
posted @ 2011-09-25 22:24 Staginner 阅读(332) 评论(0) 推荐(0) 编辑
摘要: HDU_1003最大和的子串是具有这个一个特征的,从左边第一个元素开始逐个累加,每次得到的和一定是大于等于0的,因为如果某一时刻小于0,那么前面一段我们可以抛弃,而后面一段的和一定是大于目前记录的最大和的,这样就矛盾了。然后我们根据这一特征去寻找最大和的子串即可。#include<stdio.h>#include<string.h>int main(){ int i,j,k,N,T,t,ans,x,y,tx,ty,sum; scanf("%d",&T); for(t=0;t<T;t++) { scanf("%d",& 阅读全文
posted @ 2011-09-25 22:14 Staginner 阅读(174) 评论(0) 推荐(0) 编辑
摘要: HDU_1728一开始用广搜的时候没有想到用什么方法去进行判重或剪枝,后来突然想到原来可以用走到某个点时已经拐过弯的次数作为剪枝的依据。我们用turn[i][j]这样一个数组记录走到(i,j)时已经转弯的个数,如果再次搜到这个点时转弯次数比turn[i][j]大的话,那么便不用以这个点为基础再继续向下搜了,因为之前搜过的情况一定比这种情况更优(前面的状态可以在这个点进行一次转弯来达到当前状态)。#include<stdio.h>#include<string.h>int dx[]={-1,1,0,0},dy[]={0,0,-1,1};int a[110][110],tu 阅读全文
posted @ 2011-09-25 00:33 Staginner 阅读(387) 评论(0) 推荐(0) 编辑
  2011年9月24日
摘要: HDU_1232 直接应用并查集,然后再统计一共有多少组节点即可。#include<stdio.h>#include<string.h>int p[1010],hash[1010];int find(int x){ return p[x]==x?x:(p[x]=find(p[x])); }int main(){ int i,j,x,y,tx,ty,N,M,ans; while(1) { scanf("%d",&N); if(N==0) break; scanf("%d",&M); for... 阅读全文
posted @ 2011-09-24 23:10 Staginner 阅读(162) 评论(0) 推荐(0) 编辑
摘要: HDU_1245 这个题目首先要遍历一遍所有的点,将第一次可以到达的点加入到SPFA的队列之中,并设定相应的d[]及step[]的值,其余的d[i]和step[i]都初始化成INF,之后便求出到各个点的最短路以及最短的步数,最后再扫描一遍所有点,把可以跳出lake的点做进一步的处理即可。#include<stdio.h>#include<string.h>#include<math.h>double d[110],D,x[110],y[110];int step[110],q[110],inq[110],reach[110];double dis(int i 阅读全文
posted @ 2011-09-24 22:56 Staginner 阅读(372) 评论(0) 推荐(0) 编辑
上一页 1 ··· 71 72 73 74 75 76 77 78 79 ··· 85 下一页