旅行 贪心 重庆一中高2018级竞赛班第四次测试 2016.7.25 Problem 2

本文介绍了一个简单的编程问题——快乐坐船问题,旨在帮助Mr_H计算如何选择OIer乘坐船只以获得最大的快乐程度之和,并提供了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【问题描述】
Mr_H旗下的 n 个OIer坐船外出旅行!
但是他们只有一艘船,虽然船能装下全部的OIer,但太拥挤将会影响众OIer的心情,所以Mr_H决定选择一部分OIer去。我们假设,每个人单独坐船的快乐程度是Ci,而船上每多一个人,他的快乐程度会减去Di。
现在你的任务是帮助Mr_H计算,选择那些人,才能使船上所有人的快乐程度之和达到最大。

【输入格式】
第1行是一个整数n,表示OIer的人数;
第2行有n个整数,第i个整数表示第i个人人单独坐船的快乐程度Ci(1<=Ci<=10000);
第3行有n个整数,第i个整数表示每多1人,第i个人快乐程度的下降值Di(1<=Di<=10)。

【输出格式】
第1行一个整数,是最大的快乐程度之和;
第2行一个整数,是最大的快乐程度之和所对应的汽艇上的人数(若有多种方案,则输出人数最多的)。

【输入样例】

6
10 10 10 10 10 9
2 2 2 2 2 3

【输出样例】

18
3

【样例解释】
前3个人去坐汽艇可使快乐程度之和达到最大,每个人的快乐程度均为10-2*2=6,总和是18。

【数据范围】
对于30%的数据,n<=20;
对于100%的数据,n<=1000。

【来源】
Mr_He命题

思路:又是一道简单题。考试的时候已经把思路想出来了也是对的,但是竟然把sort写到了两重循环里面(应该放在第一层里面),60分。。。

/*
    Name: travel.cpp
    Copyright: Twitter & Instagram @stevebieberjr
    Author: @stevebieberjr
    Date: 26/07/16 09:45
*/
#include<cstdio>
#include<vector>
#include<algorithm>
#define inf 1000000000
using namespace std;

int n;
int c[1005],d[1005];
vector<int>s[1005];

bool cmp(int a,int b)
{
    return a>b;
}

int main()
{
    freopen("travel.in","r",stdin);
    freopen("travel.out","w",stdout);
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&c[i]);
    }
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&d[i]);
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(c[i]-(j-1)*d[i]>0) s[j].push_back(c[i]-(j-1)*d[i]);
        }
    }
    int ans=-inf,num=0;
    for(int i=1;i<=n;i++)
    {
        if(s[i].size()<i) break;
        int cnt=0;
        sort(s[i].begin(),s[i].end(),cmp);
        for(int j=0;j<i;j++)
        {
            cnt+=s[i][j];
        }
        if(cnt>=ans)
        {
            ans=cnt;
            num=i;
        }
    }
    printf("%d\n%d\n",ans,num);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值