hdu 1598 find the most comfortable road
分类上属于最短路,,不过用枚举可以水过,, 但是却没想到怎样用最短路来求。。
把边的长度排序,每枚举一条边,按顺序添加比枚举边小的边到并查集, 判断起点和重点是否联通,如果是的话 ,另枚举更长的边,取最小值就可以了。。
# include<stdio.h> # include<string.h> # include<stdlib.h> # define PI 0xfffffff struct node{ int p,q,dis; }s[1005]; int father[205]; int find(int x) { while(father[x]!=x) x=father[x]; return x; } void Union(int x,int y) { int min,ans1,ans2; ans1=find(x); ans2=find(y); min=(ans1,ans2); father[x]=father[y]=father[ans1]=father[ans2]=min; } int cmp(const void *a, const void *b) { struct node *c=(struct node *)a; struct node *d=(struct node *)b; return c->dis - d->dis; } int main() { int i,j,n,m,min,Q,start,end; while(scanf("%d%d",&n,&m)!=EOF) { for(i=1;i<=m;i++) scanf("%d%d%d",&s[i].p,&s[i].q,&s[i].dis); qsort(s+1,m,sizeof(s[1]),cmp); scanf("%d",&Q); while(Q--) { scanf("%d%d",&start,&end); min=PI; for(i=m;i>=1;i--) { for(j=1;j<=n;j++) father[j]=j; j=i; while(j>=1) { Union(s[j].p,s[j].q); if(find(start)==find(end)) { if(min> s[i].dis - s[j].dis) min=s[i].dis - s[j].dis; break; } j--; } } if(min==PI) min=-1; printf("%d\n",min); } } return 0; }
hdu 3730 Chain
贪心可以解决。。
两种贪心的方法,,一种是对数量最多的珍珠进行讨论, 另一种是对A[i]/B[i]中最大的(既是需要插空多的)进行讨论,,
两种都写了,不过由于没用__int64 一直豆WA,,至今仍是不理解,,100000*100000 也才就10^10 ,不会超过int型的。。。
贴一个对数量进行讨论的吧:
# include<stdio.h> # define N 100005 __int64 sum,A[N],B[N]; int main() { int i,n,index; __int64 max; while(scanf("%d",&n)!=EOF) { max=0; index=-1; sum=0; for(i=1;i<=n;i++) { scanf("%I64d",&A[i]); sum+=A[i]; if(A[i]>max) {max=A[i];index=i;} } for(i=1;i<=n;i++) scanf("%I64d",&B[i]); sum-=A[index]; if(max>(sum+1)*B[index]) sum+=(sum+1)*B[index]; else sum+=A[index]; printf("%I64d\n",sum); } return 0; }