关闭

BNUOJ 14519

144人阅读 评论(0) 收藏 举报
分类:

HT的奖金

2000ms
65536KB
64-bit integer IO format: %lld      Java class name: Main
Font Size:  

五一将近,HT所在的公司又要发节日慰问金了,但他们发奖金的方式非常奇特,老板会拿着N(N<=4000)张百元大钞到HT面前,让HT从中选出连续的K张,并要求这K张的连号的(但它们可以不是按顺序排列的)。现在HT想知道,对于给定的钞票序列,他最多能拿到多少奖金呢=,=

Input

 

一个整数N,表示一共有N张钞票

接下来N行,按顺序给出每张钞票的编号。钞票编号以两个大写字母HT开头,后面紧跟8个数字。【假设这里木有假钞,所以也不可能有同号的钞票。。。】

Output

 

一个整数P,表示HT最多能得到的奖金数目

Sample Input

5
HT00000001
HT00000006
HT00000002
HT00000004
HT00000003

Sample Output

300

Hint

 

每张都是百元大钞哦~

Source

第十届北京师范大学程序设计竞赛网络预赛


就是找最大的连续位置数字,属于区间覆盖问题,做过好多次了还是不会自己写。。。

#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
const int N = 4011;
int a[N], b[N], dp[N];


int main()
{
    int n;
    char x, y;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0;i<n;i++)
        {
             scanf(" %c%c%d",&x, &y, &a[i]);
        }
        int length=0;
        for(int i=0;i<n;i++)
        {
            int Max=a[i], Min=a[i];
            for(int j=i;j<n;j++)
            {
                Max=max(Max,a[j]);
                Min=min(Min,a[j]);
                if(Max-Min+1==j-i+1&&j-i+1>length)
                {
                    length=j-i+1;
                }
            }
        }
        cout<<length*100<<endl;
    }
    return 0;
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    最新评论