大杂烩。。

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;

}

你可能感兴趣的:(大杂烩。。)