对于本题题意为:
每一站都有两种选择:从上一站带鱼,或者从本站买。因此可以得到:
本站买鱼最低价格 = min(上一站买鱼最低价+上一站运费 ,本站买鱼的价格)
本题有两种写法:
其一(前缀和做法):
#include<iostream>
#include<map>
using namespace std;
typedef pair<int ,int> PII;
PII q[110];
int n,a[110],b[110],ans=0,c;
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>q[i].first>>q[i].second;
b[i] = b[i-1] + q[i].second; //运费前缀和
}
ans += q[1].first;
int mi = 1000010; //由题可知价钱最多不超过1000000,具体多少看提供的样例
for(int i=2;i<=n;i++)
{
mi = q[i].first;
c = 0;
for(int j=1;j<i;j++)
{
//计算当前站运费(略有繁琐,可用数组保存从而优化代码)
c = b[i] - b[j-1] - q[i].second;
mi = min(q[j].first + c, mi);
}
ans += mi;
}
cout<<ans;
return 0;
}
其二(优化前缀和,覆盖原数组做法):
#include<iostream>
using namespace std;
int n;
int a[110],b[110];
int main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
}
//直接将每站最低价保留在a数组里面
int ans = a[1];
for(int i=2;i<=n;i++)
{
//(本站买鱼价钱)与(上一站买鱼价钱+运费)对比价钱
a[i] = min(a[i] , a[i-1] + b[i-1]);
ans += a[i];
}
cout<<ans;
return 0;
}
本文章仅用于解题代码分享,若是还未做题还请先自己思考一番,如果有所帮助就点个赞支持一下!