#38459: 請問範例輸出#1是否有誤


bobobo0413 (杜拜、慕尼黑、蘇黎世、清邁、東京、首爾、布拉格)

學校 : 國立臺灣大學
編號 : 252359
來源 : [42.76.162.171]
最後登入時間 :
2024-04-13 18:42:54
f638. 支點切割 -- APCS201802程式實作題3 | From: [42.79.185.28] | 發表日期 : 2023-11-25 18:14

我利用吳教授的講義練習這題,發現用講義的解釋範例輸出#1的答案是5,或者講義的題解是錯的?因為我修改成p[m],就變成範例輸出#1正確,範例輸出#2錯誤,所以覺得是這邊的範例輸出#1給錯答案,附上原始碼,也有可能我的寫錯

#include<bits/stdc++.h>
using namespace std;
#define N 50005

int p[N];
int i,n,k;
int c(int ct,int l,int r)
{
int m,mm;
long long s,mi=1e9;
if(ct>=k)
    return 0;
if((r-l)<=2)
    return 0;
for(m=l+1;m<r;m++)
{
    s=0;
    for(i=l;i<=r;i++)
{
   s+=abs(p[i]*(i-m));
}
if(mi>s)
{
    mi=s;
    mm=m;
}
}
ct++;
return c(ct,l,mm)+c(ct,mm,r)+mm;
}
int main()
{
        scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
        scanf("%d",&p[i]);
        ;
        printf("%d\n",c(0,1,n));
        return 0;
}

 
#38460: Re: 請問範例輸出#1是否有誤


bobobo0413 (杜拜、慕尼黑、蘇黎世、清邁、東京、首爾、布拉格)

學校 : 國立臺灣大學
編號 : 252359
來源 : [42.76.162.171]
最後登入時間 :
2024-04-13 18:42:54
f638. 支點切割 -- APCS201802程式實作題3 | From: [42.79.185.28] | 發表日期 : 2023-11-25 20:20

我利用吳教授的講義練習這題,發現用講義的解釋範例輸出#1的答案是5,或者講義的題解是錯的?因為我修改成p[m],就變成範例輸出#1正確,範例輸出#2錯誤,所以覺得是這邊的範例輸出#1給錯答案,附上原始碼,也有可能我的寫錯

#include
using namespace std;
#define N 50005

int p[N];
int i,n,k;
int c(int ct,int l,int r)
{
int m,mm;
long long s,mi=1e9;
if(ct>=k)
    return 0;
if((r-l)<=2)
    return 0;
for(m=l+1;m{
    s=0;
    for(i=l;i<=r;i++)
{
   s+=abs(p[i]*(i-m));
}
if(mi>s)
{
    mi=s;
    mm=m;
}
}
ct++;
return c(ct,l,mm)+c(ct,mm,r)+mm;
}
int main()
{
        scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
        scanf("%d",&p[i]);
        ;
        printf("%d\n",c(0,1,n));
        return 0;
}

我發現是參數設定錯誤,附上改正版

#include<bits/stdc++.h>
using namespace std;
#define N 50005

int p[N];
int i,n,k;
int c(int ct,int l,int r)
{
int m,mm;
long long s,mi=1e9;
if(ct>=k)
    return 0;
if((r-l)<2)
    return 0;
for(m=l+1;m<r;m++)
{
    s=0;
    for(i=l;i<=r;i++)
{
   s+=abs(p[i]*(i-m));
}
if(mi>s)
{
    mi=s;
    mm=m;
}
}
ct++;
return c(ct,l,mm-1)+c(ct,mm+1,r)+p[mm];
}
int main()
{
        scanf("%d%d",&n,&k);
    for(i=1;i<=n;i++)
        scanf("%d",&p[i]);
        ;
        printf("%lld\n",c(0,1,n));
        return 0;
}

 
ZeroJudge Forum