2016計蒜之道初賽第四場---------淘寶流量分配【水題】
在每年的淘寶“雙十一”時,訪問量都會暴漲,伺服器的請求會被流量分配程式按照一定策略,分發給不同的程序去處理。有一類請求,有兩個程序可以接受分發的請求,其中一個程序所在伺服器的配置、網路傳輸效能等都要優於另一個程序。流量分發程式可以知道佇列中每個任務的預計處理時間,每次都會盡可能將佇列中預計處理時間更多的任務分配給效能更優的程序。
假設隊列當前一共有 nn 個任務待分配,第 ii 個任務的預計處理時間為 a_i(1 \leq i \leq n)a
i
(1≤i≤n)。由於服務存在冷啟動問題,越靠後的程序,預計處理時間越短。而佇列中的 最後一個任務 因為比較特殊,預計處理時間和之前的任務 無關。即前 n-1n−1 個任務的預計處理時間滿足 a_1 > a_2 > ... > a_{n-1}a
1
>a
2
>...>a
n−1
。現在要從中選出一個任務列表,不能有任何兩個任務在原佇列中相鄰。計算選出的任務佇列預計處理時間之和的最大值。
輸入格式
輸入第一行有一個整數 n(1 \leq n \leq 10^{4})n(1≤n≤10
4
),表示任務總數。
輸入第二行有 nn 個整數 a_i(0 \leq a_i \leq 10^{4})a
i
(0≤a
i
≤10
4
),表示每個任務的預計處理時間。
輸出格式
輸出一個整數,表示選出的任務的預計處理時間之和的最大值。
樣例輸入1
5
4 3 2 1 5
樣例輸出1
11
樣例輸入2
4
5 3 1 9
樣例輸出2
14
提示資訊
對於第一組樣例,選出的總預計處理時間最大為 4+2+5=114+2+5=11。
對於第二組樣例,選出的總預計處理時間最大為 5+9=145+9=14。
思路:
因為序列是遞減的,所以我們直接分成奇偶長度來考慮,
1、如果是奇長度,直接從第一個數加到最後一個數就行。
2、如果是偶長度,討論一下最後一個數和倒數第二個數的大小,取大的那個即可。
AC程式碼:
#include<stdio.h> #include<string.h> using namespace std; int a[100000]; int main() { int n; while(~scanf("%d",&n)) { int output=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); } if(n%2==1) { for(int i=0;i<n;i+=2) { output+=a[i]; } printf("%d\n",output); } else { if(a[n-1]>a[n-2]) { for(int i=0;i<n-2;i+=2) { output+=a[i]; } output+=a[n-1]; } else { for(int i=0;i<n;i+=2) { output+=a[i]; } } printf("%d\n",output); } } }