P5638 【CSGRound2】光骓者的荣耀题解?【wowkaka】

对你的进步没什么帮助的废话t: 今天学习了前缀和与差分及类似物在一天的结束之时做了这么一道题给我WA哭了 作文以祭之

题意:

据说有一串城市,你得从第一个城市转移到最后一个城市。相邻城市之间有道路,经过的时间为ai,你有一个传送器可以把你传送到距你有c个城市远的地方(比如你在城市3,c=2,那么你就可以被传送到城市5 因为5=3+2)且传送不花费时间,问:最少花费多长时间转移到最后一个城市

分析:

今天学前缀和就用前缀和的方法做,先对输进来的道路通过时间求前缀和,再遍历道路数组上的长度为c的区间找到可以用传送器的最大路程,最后用总路程减去这段可以用传送器的路程就是花费的最小时间(这里路程和时间一个意思)

代码:

输入及求前缀和:

cin>>n>>c;
for(ll i=1;i<n;i++){
	cin>>tab[i];
	tab[i]+=tab[i-1];
}

找可以用传送器的最大路程:

for(ll i=1;i+c<=n-1;i++){
	if(sum<tab[i+c]-tab[i]){
		sum=tab[i+c]-tab[i];
	}
}

最后做差输出就行了…
需要注意的是:这里的sum(可以用传送器的最大路程)应该初始化为什么呢??
本蒟蒻就在这里初始化为了一个负极大值(所以WA哭)
正解是初始化为一个tab(路程ai)中的数 想一想 为什么(滑稽)

#include
#define ll long long
#define NN 1000005
using namespace std;
ll n,c,sum=-999;// sum=-999误 
ll tab[NN];
int main(){
	cin>>n>>c;
	for(ll i=1;i<n;i++){
		cin>>tab[i];
		tab[i]+=tab[i-1];
	}
	sum=tab[c];//不加这句话 就会WA WA WA WA WA
	for(ll i=1;i+c<=n-1;i++){
		if(sum<tab[i+c]-tab[i]){
			sum=tab[i+c]-tab[i];
		}
	}
	cout<<tab[n-1]-sum;
	return 0;
} 

你可能感兴趣的:(wowkaka的自毁之路)