厦门理工学院oj-贪吃的学姐
Description
美丽的静雯学姐有N根棒棒糖,每根棒棒糖有一个价格price(元)和保质期date(还能存放的天数),为了保护牙齿,静雯学姐每天只能吃掉一根棒棒糖。学姐总是尽可能的吃掉最贵的棒棒糖,但是她从不吃过期的棒棒糖!为了避免太多金钱亏损,请问,学姐最多能够吃掉多少价格的棒棒糖。
Input
第一行为一个整数N,表示棒棒糖的总数(1<=N<=100)
接下来是N行,表示N根棒棒糖的相关数据,每行两个整数price和data(1<=price,date<=100),price是棒棒糖的价格,date是该棒棒糖还能存放的天数。N行的price值已经按从高到低排好序。
Output
输出一个整数,表示最多能够吃掉的棒棒糖价格之和
Sample Input
3
20 2
10 1
5 2
Sample Output
30
题解:
我的解题思路为遍历一遍保存价格的数组,把遍历到的糖果设置为保质期的最后一天吃,这样就可以保证能吃到价格最大的糖果的同时保质期之前的时间不会浪费,留给其他的的糖果。如果保质期的最后一天已经被之前价格更大的糖果预定了,就往前搜索,搜索到未被预定的一天,再预定这一天。
代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> candy, date; //保存价格和日期
int n, ans = 0;
bool eat[105] = { false }; //设置预定吃糖果的日期数组为false,如果被预定就设为true
cin >> n;
for (int i = 0, a, b; i < n; i++) {
cin >> a >> b;
candy.push_back(a);
date.push_back(b - 1); //由于日期是从1开始算的,减一存入数组
}
for (int i = 0; i < n; i++) {
int x = date[i];
if (!eat[x]) { //如果保质期最后一天未被预定,预定这一天吃这个糖果
eat[x] = true;
ans += candy[i];
}
else { //如果被预定,则往前遍历寻找未被预定的日期
while (x > 0) {
if (!eat[x - 1]) {
eat[x - 1] = true;
ans += candy[i];
break;
}
x--;
}
}
}
cout << ans;
return 0;
}