题目:有一条高铁共经过n个城市Sim要乘高铁游览这条高铁线路上的m个城市,从q[1]开始一直到q[m],第i段铁路可以在这段铁路的出发点用a[i]元买纸质票,或在线上用c[i]元买一张IT卡,随时可以往里充钱,每次走这段铁路自动扣费b[i]元,问最少花费多少元?
int n,m;
cin>>n>>m;
int p[m+1],a[n],b[n],c[n];
for(int i=1;i<=m;i++){
cin>>p[i];
}
for(int i=1;i<n;i++){
cin>>a[i]>>b[i]>>c[i];
}
int roa[n];
for(int i=1;i<n;i++){
roa[i]=0;//roa统计每条路走的次数。
}
for(int i=1;i<m;i++){//用前缀和统计每条路走的次数
if(p[i]<p[i+1]){
roa[p[i]]++;
roa[p[i+1]]--;
}else{
roa[p[i+1]]++;
roa[p[i]]--;
}
}
int road[n];
road[0]=0;
for(int i=1;i<n;i++){//用road数组存储算出来的前缀和
road[i]=road[i-1]+roa[i];
}
int sum=0;
for(int i=1;i<n;i++){//输出
if(road[i]*b[i]+c[i]>a[i]*road[i]){
sum+=road[i]*a[i];
}else{
sum+=c[i]+road[i]*b[i];
}
}
cout<<sum;
题目:现有n头牛,最高的牛是第p头,高h厘米。如果两头牛中间的牛都比他们矮,则这两头牛可以相望,现在给出m对可以两两相望的牛,问每头牛最高多高?
差分:
//a1,a2,a3,a4,a5
//1 2 3 4 5
//b1=a1 b2=a2-a1 b3=a3-a2 b4=a4-a3 b5=a5-a4
int n,p,h,m;
cin>>n>>p>>h>>m;
int a[n+1];//a数组用前缀和的方式记录每头牛身高
for(int i=1;i<=n;i++){
a[i]=0;
}
//两头牛中间的牛身高-1 -> 用前缀和的方法,在相望两牛中左边那头的右边一头的位置-1,相望两牛
//中右边那头的位置+1,中间一段的前缀和就能-1
for(int i=0;i<m;i++){
int x,y;
cin>>x>>y;
a[y]++;
a[x+1]--;
}
cout<<highest+a[1]<<" ";
for(int i=2;i<=n;i++){算出前缀和并输出
a[i]=a[i-1]+a[i];
cout<<h+a[i]<<" ";
}