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;
}
浙公网安备 33010602011771号