我利用吳教授的講義練習這題,發現用講義的解釋範例輸出#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;
}
我利用吳教授的講義練習這題,發現用講義的解釋範例輸出#1的答案是5,或者講義的題解是錯的?因為我修改成p[m],就變成範例輸出#1正確,範例輸出#2錯誤,所以覺得是這邊的範例輸出#1給錯答案,附上原始碼,也有可能我的寫錯
#include
using namespace std;
#define N 50005int 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;
}