在codechef 10月挑战儿童旅行的错误答案?

时间:2014-10-14 16:19:42

标签: c algorithm

这是比赛的问题陈述:http://www.codechef.com/OCT14/problems/TRIPS
P.S。:我看过社论,但想知道我的解决方案有什么问题。
这是Bytelandian学校的新趋势。 " Byteland旅游局"为高中生开发了一个新项目。该项目是所谓的“儿童旅行”#34;。 该项目本身非常简单:Byteland有一些旅游路线, N个旅游校园(编号从1到N)。为了经济起见,它们之间恰好有N-1道路。当然,即使有这个,也可以从任何旅游校园旅行到任何其他旅游校园。此外,为了安全起见,每条道路不超过2公里 当一个学生想要旅行时,他首先选择他的起始校园 - 他被直升机送到那里(比方说)。他也选择了他最终的目的地校园。从他的最终目的地,他将再次乘直升机(例如)直接送往他家。这样学生就不会徒步旅行任何额外的距离。当选择开始和结束并且交付瞳孔时,他开始他的唯一路线移动。没有一个学生是无限强大的,所以首先学生看着旅游路线的地图,然后他选择了他在当天可以到达的最远的校园(根据安全规定,严禁睡不着在校园,因为狼人会有一点麻烦,并在那里移动。然后新的一天开始,它重复到目的地到达的那一刻 当然,并非所有学生都是平等的。有人擅长数学,有人用英语,有人在体育。因此,所有高中生都有不同的优势,这很自然。 我们称力量是学生一天可以通过的最大公里数。现在,您已经收到了孩子们的大量疑问。对于每个查询,您将获得起始校园,最终校园和实力。您需要计算每次旅行的天数。校园地图和它们之间的距离也会给你 输入
第一行输入包含整数N,表示校园的数量 接下来的N-1线包含X Y D形式的三元组,意思是在第X和第Y个校园之间有一条道路,长度为D千米。
然后有一个带有单个整数M的行,表示查询的数量 然后,有M行具有S F P形式的三元组,其意思是行程从校园S开始,在校园F结束,学生具有P的强度。 输出
对于每个查询,请在单独的行中输出天数。 约束
1≤N,M≤100000
1≤X,Y,S,F≤N
1≤D≤2
2≤P≤2* N
例如
输入:
5
1 2 1
2 3 2
1 4 2
4 5 1
5
1 5 3
1 3 2
2 5 4
1 2 10
4 5 2
输出:
1
2
1
1
1


我使用的逻辑:
因为边数是n-1和n个顶点因此将有n-2个顶点,其中2度和2个顶点具有1度(这将是两个端点)。我做的是我创建了4个大小的数组n,其中两个将存储来自该顶点的下一个顶点的值,另外两个将把权重存储在该顶点的边缘上。现在我将发现起始和结束顶点,因为它们通过使用输入只有1级。一旦我得到起点,我将遍历它到存储下一个顶点和边缘权重的终点的唯一路径。现在每当我得到查询时,我只是将数据路径存储在数组中,现在我只是遍历数组并且得到我的结果 我的代码:

#include<stdio.h>
int main()
{   
    int n;
    scanf("%d",&n);
    int a[n],weighta[n],b[n],weightb[n],i,j,k,x,y,d,count,previousj;
    //initialize
    for (i = 0; i < n; ++i)
    {
        a[i]=-1;b[i]=-1;weighta[i]=-1,weightb[i]=-1;
    }
    for(i=0;i<n-1;i++)
    {
        scanf("%d%d%d",&x,&y,&d);
        if(a[x-1]==-1)
        {
            a[x-1]=y-1;
            weighta[x-1]=d;
        }
        else
        {   
            b[x-1]=y-1;
            weightb[x-1]=d;
        }   
        if(a[y-1]==-1)
        {   
            a[y-1]=x-1;
            weighta[y-1]=d;
        }
        else
        {   
            b[y-1]=x-1;
            weightb[y-1]=d;
        }
    }
    /*for (i = 0; i < n; ++i)
    {
        printf("a[i] %d weighta[i] %d b[i]%d  weightb[i] %d\n",a[i],weighta[i],b[i],weightb[i]);
    }*/
    for(i=0;i<n;i++)
    {
        if(b[i]==-1)
            break;
    }
    //printf("first end %d %d\n",i,a[i] ); 
    int finalval[n],finalweight[n];
    for (k = 0; k < n; ++k)
    {
        finalval[k]=0;finalweight[k]=0;
    }
    j=i;count=0;
    finalval[count]=j;
    finalweight[count]=weighta[j];
    previousj=j;
    j=a[j];
    //printf("count %d finalval %d finalweight %d\n",count,finalval[count],finalweight[count] );
    count++;
    //printf("%s\n","HI" );
    while(b[j]!=-1)
    {        //printf("%d\n",b[j] );
        //finalval[count]=j;
        //finalweight[count]=weighta[j];
        if(a[j]!=previousj)
        {
            finalval[count]=j;
            finalweight[count]=weighta[j];
            previousj=j;
            j=a[j];
            //printf("count %d finalval %d finalweight %d\n",count,finalval[count],finalweight[count] );
            count++;
        }
        else
        {
            finalval[count]=j;
            finalweight[count]=weightb[j];
            previousj=j;
            j=b[j];
            //("count %d finalval %d finalweight %d\n",count,finalval[count],finalweight[count] );
            count++;
        }   

    }
    finalval[count]=j;
            finalweight[count]=finalweight[count];
            count++;
    /*
    for (i = 0; i < n; ++i)
    {
        printf("final %d %d\n",i,finalval[i] );
    }*/
    int m;
    scanf("%d",&m);
    while(m--)
    {   int s,f,p,flag=0,pos_s,pos_f;
        scanf("%d%d%d",&s,&f,&p);
        s--;f--;
        for (i = 0; i <count; ++i)
        {
            if(finalval[i]==s)
            {
                pos_s=i;
                if(flag==1)
                    break;
                flag=1;
            }
            if(finalval[i]==f)
            {   
                pos_f=i;
                if(flag==1)
                    break;
                flag=1;
            }
        }
        int temp,days;
        //("pos_s %d pos_f %d\n",pos_s,pos_f);
        if(pos_s<pos_f)
        {   //printf("%s\n","hi" );
            temp=p;days=1;
            for(i=pos_s;i<pos_f;i++)
            {
                if(temp>finalweight[i])
                    temp-=finalweight[i];
                else if(temp==finalweight[i])
                {
                    //days++;
                    temp=0;
                }   
                else
                {   
                    days++;
                    temp=p;
                    temp-=finalweight[i];
                }   
            }   
            //if(temp==p)
            //  days--;

        }
        else if(pos_s==pos_f)
            days=1; 
        else
        {   temp=p;days=1;
            for(i=pos_s-1;i>=pos_f;i--)
            {
                if(temp>finalweight[i])
                    temp-=finalweight[i];
                else if(temp==finalweight[i])
                {
                    //days++;
                    temp=0;
                }   
                else
                {   
                    days++;
                    temp=p;
                    temp-=finalweight[i];
                }   
            }   
            //if(temp==p)
            //  days--;

        }
        printf("%d\n",days);        




    }   



    return 0;
} 

1 个答案:

答案 0 :(得分:0)

以下网络怎么样?

  1
  |
2-3-4

4分,3分......