1036. 二哥去取钱

Description

二哥来到一家银行。这家银行有3个柜台。二哥对银行的排队方式产生了兴趣。传统的排队方式是所有人都在柜台前排队,每个人进入银行后挑一个人数最少的队伍排上,要是人数一样,他会排那个柜台编号靠前的。

新的排队方式是每个人进入银行后只排一个队伍,一旦某个柜台有空,队伍最前的人就过去。

现在有N(N<100000)

个人在第0时刻里按照顺序进入了银行,并知道每个人的柜台占用时间。请计算两种排队方式下所有顾客等待时间的和及最后一个人处理完的时间。

Input Format

N,代表要进入银行的人数

a[1]...a[n],a[i]代表第i个人要占用柜台的时间

Output Format

W1 T1,分别代表老排队方式下所有顾客等待时间总和与最后一个人处理完的时刻

W2 T2,分别代表新排队方式下所有顾客等待时间总和与最后一个人处理完的时刻

Sample Input

4
1 1 1 2

Sample Output

1 3
1 3



#include <iostream>  
#include <stdio.h>  
using namespace std;  
      
int a[100000];  
long long s[3]={0},sum[3]={0};  
int minIndex(){  
    int t=(sum[1]<=sum[2]?1:2);  
    t=(sum[0]<=sum[t]?0:t);  
    return t;  
}  
long long max(long long a,long long b,long long c){  
    b=(b>c?b:c);  
    return (a>b?a:b);  
}  
int main(){  
    int n,i,k;  
    long long w1,t1,w2,t2;  
    scanf("%d",&n);  
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }  
    for(i=0;i<n;i+=3){  
        s[0]+=sum[0];  
        sum[0]+=a[i];  
    }  
    for(i=1;i<n;i+=3){  
        s[1]+=sum[1];  
        sum[1]+=a[i];  
    }  
    for(i=2;i<n;i+=3){  
        s[2]+=sum[2];  
        sum[2]+=a[i];  
    }  
    w1=s[0]+s[1]+s[2];  
    t1=max(sum[0],sum[1],sum[2]);  
    
    s[0]=s[1]=s[2]=sum[0]=sum[1]=sum[2]=0;  
    for(i=0;i<n;i++){  
        k=minIndex();  
        s[k]+=sum[k];  
        sum[k]+=a[i];  
    }  
    w2=s[0]+s[1]+s[2];  
    t2=max(sum[0],sum[1],sum[2]);  
    printf("%lld %lld\n%lld %lld\n",w1,t1,w2,t2);  
    return 0;  
}  

 

posted @ 2017-12-05 13:11  bernieloveslife  阅读(292)  评论(0编辑  收藏  举报