您的位置:首页 > 其它

计蒜客--贪心--淘宝流量分配

2018-08-22 23:30 316 查看

在每年的淘宝“双十一”时,访问量都会暴涨,服务器的请求会被流量分配程序按照一定策略,分发给不同的进程去处理。有一类请求,有两个进程可以接受分发的请求,其中一个进程所在服务器的配置、网络传输性能等都要优于另一个进程。流量分发程序可以知道队列中每个任务的预计处理时间,每次都会尽可能将队列中预计处理时间更多的任务分配给性能更优的进程。

假设队列当前一共有 nnn 个任务待分配,第 iii 个任务的预计处理时间为 ai(1≤i≤n)a_i(1 \leq i \leq n)ai​(1≤i≤n)。由于服务存在冷启动问题,越靠后的进程,预计处理时间越短。而队列中的 最后一个任务 因为比较特殊,预计处理时间和之前的任务 无关。即前 n−1n-1n−1 个任务的预计处理时间满足 a1>a2>...>an−1a_1 > a_2 > ... > a_{n-1}a1​>a2​>...>an−1​。现在要从中选出一个任务列表,不能有任何两个任务在原队列中相邻。计算选出的任务队列预计处理时间之和的最大值。

输入格式

输入第一行有一个整数 n(1≤n≤104)n(1 \leq n \leq 10^{4})n(1≤n≤104),表示任务总数。

输入第二行有 nnn 个整数 ai(0≤ai≤104)a_i(0 \leq a_i \leq 10^{4})ai​(0≤ai​≤104),表示每个任务的预计处理时间。

输出格式

输出一个整数,表示选出的任务的预计处理时间之和的最大值。

样例输入1

5
4 3 2 1 5

样例输出1

11

样例输入2

4
5 3 1 9

样例输出2

14

题目来源

2016 计蒜之道 初赛 第四场

解题思路:分n为奇数和偶数情况讨论:当n为奇数个时,只挑选奇数位(1,3,5...)一定为最大和;当n为偶数个时,只要挑选相邻两个数中较大的那个数即可。

[code]#include <iostream>
#include <bits/stdc++.h>
using namespace std;

int a[10001];
int n;

int main()
{
int sum = 0, maxn = 0;
cin >> n;
for(int i = 1; i <= n; i++)
cin >> a[i];
if(n%2==1){//n为奇数
for(int i = 1; i <= n; i++){
if(i%2==1) sum += a[i];
}
}
else {
for(int i = 1; i < n; i+=2){
if(a[i] >= a[i+1]){
sum += a[i];
}
else {
sum += a[i+1];
}
}
}
cout << sum;
return 0;
}

 

阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: