• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
HaibaraAi
博客园    首页    新随笔    联系   管理    订阅  订阅

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 }
View Code
posted @ 2013-11-15 12:13  HaibaraAi  阅读(127)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3