FOJ 2013 11 月赛 E
Problem E 取糖果
Accept: 65 Submit: 299 Time Limit: 1000 mSec Memory Limit : 32768 KB
Problem Description
有N个袋子放成一排,每个袋子里有一定数量的糖果,lzs会随机选择连续的几个袋子,然后拿走这些袋子中包含最多糖果的袋子。现问你,在选择x个袋子的情况下,lzs最坏情况下,也就是最少会拿到多少个糖果?对于x取值为1到n都分别输出答案。
Input
第一行一个整数T,表示有T组数据。
每组数据先输入一行一个整数N(1<=N<=100000),表示袋子数,接下来一行输入N个正整数,输入的第i个数表示第i个袋子所装的糖果数。
Output
每组数据输出n行,第i行表示lzs随机取连续的i个袋子时的最坏情况下能拿到的糖果数。
Sample Input
1
5
1 3 2 4 5
Sample Output
1
3
3
4
5
Cached at 2013-11-15 12:09:34.
1 #include<cstdio> 2 #include <algorithm> 3 using namespace std; 4 const int INF = 1 << 30; 5 int a[100005], s[100005]; 6 7 int main() 8 { 9 int i, j, k, n, t, sum, l, r; 10 scanf("%d", &t); 11 while (t--) 12 { 13 scanf("%d", &n); 14 for (int i = 1; i <= n; i++){ 15 scanf("%d", &a[i]); 16 s[i] = INF; 17 } 18 for (int i = 1; i <= n; i++){ 19 l = i - 1; r = i + 1; 20 while (a[l] <= a[i]&&l>=1)l--; 21 while (a[r] <= a[i]&&r<=n)r++; 22 k = r - l - 1; 23 s[k] = min(s[k], a[i]); 24 } 25 for (int i = n - 1; i >= 0; i--){ s[i] = min(s[i], s[i + 1]); } 26 for (int i = 1; i <= n; i++){ printf("%d\n", s[i]); } 27 } 28 return 0; 29 }
浙公网安备 33010602011771号