【问题描述】
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;
}