1>问题描述
2>自己最初的代码
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
/*
*想到用动态规划
*dp[i][j]表示只有前i张桌子,并且只有前j批游客的情况下。
*餐馆能获得的最大收益
*但是,思路有问题。状态方程有问题
*/
int main()
{
int tableLen=0,customsLen=0;
vector<int>everyCusNums;
vector<int>everyCusMoney;
vector<int>everyTableRL;
while(cin>>tableLen>>customsLen)
{
everyTableRL.resize(tableLen,0);
everyCusNums.resize(customsLen,0);
everyCusMoney.resize(customsLen,0);
for(int i=0;i<tableLen;++i)
cin>>everyTableRL[i];
for(int i=0;i<customsLen;++i)
{
cin>>everyCusNums[i];
cin>>everyCusMoney[i];
}
//处理
sort(everyTableRL.begin(),everyTableRL.end());
int rows = tableLen+1;
int cols = customsLen+1;
vector<vector<int>>dp;
dp.resize(rows);
for(int i=0;i<rows;++i)
dp[i].resize(cols,0);
for(int i=1;i<rows;++i)
for(int j=1;j<cols;++j)
{
if(everyCusNums[j-1]>everyTableRL[i-1])
dp[i][j] = dp[i][j-1];
else
{
dp[i][j] =max(dp[i][j-1],dp[i-1][j-1]+everyCusMoney[j-1]);
/*这个地方肯定有问题*/
}
}
cout<<dp[rows-1][cols-1]<<endl;
}
}
运行结果:
3>用优先队列(第一次用priority_queue)
#include<iostream>
#include<vector>
#include<algorithm>
#include<queue>
using namespace std;
class customer
{
public:
int num;
int money;
customer():num(0),money(0){}
customer(int a,int b):num(a),money(b){}
};
bool customerVecSort(const customer &a,const customer &b)
{
return a.num<b.num;
}
class que_cmp
{
public:
bool operator ()(const customer &cus1, const customer &cus2)
{
//注意优先队列的排序方法
//这样,按照money从大到小进行排序
return cus1.money<cus2.money;
}
};
int main()
{
int tableCnt=0,customsCnt=0;
vector<int>tables;
vector<customer>customers;
while(scanf("%d %d",&tableCnt,&customsCnt)!=EOF)
{
tables.resize(tableCnt,0);
customers.resize(customsCnt);
for(int i=0;i<tableCnt;++i)
scanf("%d",&tables[i]);
for(int i=0;i<customsCnt;++i)
{
scanf("%d",&customers[i].num);
scanf("%d",&customers[i].money);
}
//tables从小到大排序
//customers按照每批客人的人数进行从小到大进行排序
sort(tables.begin(),tables.end());
sort(customers.begin(),customers.end(),customerVecSort);
long long res = 0;
priority_queue<customer,vector<customer>,que_cmp> priQue;
/**下面时关键**/
//桌子从小到大进行排序,能坐小桌子的游客(先进入priQue)也一定能坐大桌子
//循环tableCnt次,每次取一个当前priQue中的最大消费值
//有点类似动态规划,循环到i时,表示前面 i+1张桌子可选的情况下,最终结果res的值
int j=0;
for(int i=0;i<tableCnt;++i)
{
for(;j<customsCnt&&customers[j].num<=tables[i];++j)
priQue.push(customers[j]);
if(priQue.empty())
continue;
res+=priQue.top().money;
priQue.pop();
}
printf("%ld\n",res);
}
}