思路:由于任何一种方案每段路都会走两次,所以我们考虑每段路的来回花费可以单方向计算,直接判断是否超过m即可,算法复杂度O(n);
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int cost,j;
struct name
{
int z,n;
}a[1000001];
int main ()
{
char x;
int m,t,u,f,d;
cin>>m>>t>>u>>f>>d;
for (int i=1;i<=t;i++)
{
cin>>x;//读入判断
if (x=='u')
{
a[i].z=u;
a[i].n=d;
}
if (x=='f')
{
a[i].z=f;
a[i].n=f;
}
if (x=='d')
{
a[i].z=d;
a[i].n=u;
}
}
while(cost<m)
{
j++;
cost+=a[j].z+a[j].n;//判断每段路的话费是否超过m
}
cout<<j-1;//由于最后会再执行一次循环于是输出减一
return 0;
}