洛谷 P2008 大朋友的数字

这篇文章讲述了如何根据NOIP2013比赛中的题目,计算每个大朋友(15岁以上)的分数,该分数基于他们手中数字构成的最长不下降子序列。C++代码给出了问题的解决方案。

题目背景

在 NOIP2013 的赛场上,常神牛华丽丽的手残了,小朋友的数字一题只得了 1010 分。于是,他要恶搞一下这道题。

题目描述

有一批大朋友(年龄 1515 岁以上),他们每人手上拿着一个数字,当然这个数字只有 11 位,也就是 00 到 99 之间。每个大朋友的分数为在他之前的最长不下降子序列中所有数之和。(这个序列必须以它作为结尾!)如有多个最长不下降子序列,那么取编号字典序最小的。现在告诉你有 n 个大朋友,以及他们各自的数字,请你求出他们每个人的分数。

输入格式

第一行,11 个数 n。

第二行,n 个数,分别表示每个人的数字。

输出格式

一行,n 个数,分别表示每个人的分数。

说明/提示

【样例解释 11】

五个人分数分别为 (1),(1+2),(1+2+5),(1+2+3),(1+2+3+4)(1),(1+2),(1+2+5),(1+2+3),(1+2+3+4)。

【样例解释 22】

五个人分数分别为 (1),(1+7),(1+5),(1+7+9)(1),(1+7),(1+5),(1+7+9) (还有一个 (1,5,9)(1,5,9)),(1+5+6)(1+5+6)。

【数据规模】

#include <bits/stdc++.h>
using namespace std;
long long n;
long long arr[10010],f[10010],sum[10010];

int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);

    cin>>n;
    for(long long i=0;i<n;i++){
        cin>>arr[i];
    }
    for(long long i=0;i<n;i++){
        sum[i]=arr[i];
        for(long long j=0;j<i;j++){
            if(arr[j]<=arr[i]&&f[i]<f[j]+1){
                f[i]=f[j]+1;
                sum[i]=sum[j]+arr[i];
            }
        }
        cout<<sum[i]<<' ';
    }
    return 0;
}

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值