首页 > 代码库 > soj 4390 电梯问题

soj 4390 电梯问题

背景:周赛题,当时未读。就算读了也只能想到暴力,不可ac。

学习:1.在暴力搜索超时的情况下,必须找到优秀的算法,这个题就是用类似变化趋势的角度来审视最优解而不是算出每层楼对应的值,找最大值。思路:假设当前楼层以下有n1人,当前楼层有n2人,当前楼层以上有n3人。每向上走一层就有n1+n2人要多走一楼,来

人要少走一楼,若从第0楼开始考虑,这时n1+n2是0,n3为总人数,然后依次上楼,n1+n2单增,n3单减,显然n1+n2>=n3停止上楼即取最大值。

代码:

#include <stdio.h>
#include<stdlib.h>
#include<math.h>
short str[1000000];
int main(){
    int t;
    scanf("%d",&t);
    while(t--){
    	int n,floor,n1=0,n2=0,n3,sum=0;
    	long long people=0;
    	scanf("%d",&n);
    	for(int i=0;i<n;i++){
    	    scanf("%hd",&str[i]);
    	    sum+=str[i];
    	}
    	for(int i=0;i<n;i++){
    	    if(i>0)
    	    n1+=str[i-1];
    	    n2=str[i];
    	    n3=sum-n1-n2;
    	    if(n1+n2-n3>=0){
    	    	floor=i+1;
    	    	for(int k=0;k<n;k++) people+=str[k]*(abs(i-k));
    	    	break;
    	    }    
    	}    
    	printf("%d %lld\n",floor,people);
    }
	return 0;
}


soj 4390 电梯问题