小信的图腾题解

小信最近沉迷魔兽世界,他每天为了在副本中打出更好的数据,苦练他的职业-祭祀萨满。小信想要将他的技能-增强图腾磨练到极致,副本中一共有n个排成一排的位置,用数组a表示,如果a[i]=1说明第i个位置有一个增强图腾,a[i]=0,说明该位置没有图腾。每个图腾都有一个统一的扩散范围r,假如第i个位置有图腾,那么当图腾开启后范围[i-r+1,i+r-1]的队友都会获得增强BUFF。小信是一名非常节约资源的玩家,他希望尽量少的开启图腾,使得n个位置都能被图腾的范围覆盖到。

思路

首先我们可以正序遍历数组,

如果当前位置没有被覆盖(注意未展开的图腾这一个它也是处于没有覆盖的情况的!!!)别问我咋知道的(如果没有找更靠右的课已覆盖的图腾,并将它可以覆盖的地方设为已覆盖,如果变了后这个点仍未被覆盖输出-1。

WA50代码碎片

	for(int i=1;i<=n;i++){
		if(vis[i]){
			continue;
		}
		for(int j=max(0,i+r-1);j>=i-r+1;j--){
			if(a[j]){
				cnt++;
				for(int k=max(0,j-r-1);k>=j-r+1;k--){
					vis[k]=1;
				}
				break;
			}
		}
		if(!vis[i]){
			cout<<"-1"<<endl;
			return 0;
		}
	}

喜欢的点个赞吧QWQ