#38923: c(39ms, 2.4MB)/c++(41ms, 2.4MB)這題寫好發現超時,於是看講義發現是用分治,於是修改呼叫函式,終於寫好了


bobobo0413 (Andy)

學校 : 國立臺灣大學
編號 : 252359
來源 : [163.30.63.65]
最後登入時間 :
2024-11-11 10:00:57
h029. 202001_4 貨物分配 -- 2020年1月APCS | From: [114.137.242.232] | 發表日期 : 2024-01-03 22:58

一開始寫好覺得太好了,我進步到這種難度題目也會寫了,結果居然超時。後來用分治就過了,我其實不大知道時間複雜度是甚麼或怎麼算,總之測試分治有成功。快速地介紹解題思路:開三個陣列,一個紀錄重量,一個紀錄左編號,一個紀錄右編號,使用分治函式呼叫1,於是重量的陣列累加完成,這個是不超時的關鍵。然後分辨左右重量,以及累加依序進入的貨物重量,依序輸出最後到達貨箱編號。原始碼如下:

#include<cstdio>
#define N 200005
int a[N]={0},l[N],r[N];
int n,m,i,p,s,t;
int w(int g)
{
    if(g>=n) return a[g];
a[g]=w(l[g])+w(r[g]);
return a[g];
}
int main()
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
    scanf("%d",&a[n+i]);
int b[m],d[n][2],f,e;
for(i=0;i<m;i++)
    scanf("%d",&b[i]);
    for(i=1;i<n;i++)
    {
        scanf("%d%d%d",&p,&s,&t);
l[p]=s;
r[p]=t;
    }
    int j=2*n;
    a[1]=w(1);
    for(i=0;i<m;i++)
    {
        f=1;
        while(f<n)
        {
            if(a[l[f]]<=a[r[f]])
                f=l[f];
            else
     f=r[f];
     a[f]+=b[i];
            }
        if(i==0)
printf("%d",f);
else
    printf(" %d",f);
    }
    printf("\n");
    return 0;
}

 
ZeroJudge Forum