此題用貪心求解,
首先將caramel drop類別的糖果按照高度從小到大排序,如果高度相同,按照重量從小到大排序
將fruit drop類別的糖果按照高度從小到大排序,如果高度相同,按照重量從小到大排序
現在有兩種可能
第一種可能是第一個獲得的糖果是caramel drop,
則先搜尋caramel drop類別的,然後找到高度小於x的最大高度的index,則在0~index索引之間的高度都小於x,則搜尋0~index之間的mass最大的,這樣之後高度變得最大,計數值加1,更新x
在搜尋fruit drop類別的,然後找到高度小於x的最大高度的index,則在0~index索引之間的高度都小於x,則搜尋0~index之間的mass最大的,這樣之後高度變得最大,計數值加1,更新x(跟caramel drop類別搜尋的一樣)
第二種可能是第一個獲得的糖果是fruit drop,其搜尋過程是上面的兩個過程反過來
#include <iostream> #include <vector> #include <algorithm> #include <string> #include <cstring> using namespace std; struct Fruit{ int height; int mass; Fruit(int height_ = 0 , int mass_ = 0):height(height_),mass(mass_){} bool operator <(const Fruit& a) const { if(height != a.height) return height < a.height; else return mass < a.mass; } }; int main(){ int n,x; cin >> n>>x; vector<Fruit> fruit[2]; for(int i = 0 ; i < n; ++ i){ int t,h,m; cin >> t >> h >> m; fruit[t].push_back(Fruit(h,m)); } sort(fruit[0].begin(),fruit[0].end()); sort(fruit[1].begin(),fruit[1].end()); int ans = 0; for(int type = 0 ; type < 2; ++ type ){ vector<vector<bool> > visit(2); for(int i = 0 ; i < fruit[0].size(); ++ i) visit[0].push_back(false); for(int i = 0 ; i < fruit[1].size(); ++ i) visit[1].push_back(false); int res = 0,new_x = x; bool flag = true; while(flag){ for(int k = 0; k < 2; ++ k){ int new_type = (type+k)%2, index = fruit[new_type].size()-1;
//搜尋高度小於new_x的最大高度 for(;index>=0; --index){ if(!visit[new_type][index] && fruit[new_type][index].height <= new_x) break; } if(index < 0 ) {flag = false;break;}
//在滿足條件的高度中搜尋質量最大的 int maxMassIndex = index,maxMass = fruit[new_type][index].mass; for(int i = index -1; i >=0; -- i){ if(!visit[new_type][i] && fruit[new_type][i].mass > maxMass){ maxMass = fruit[new_type][i].mass ; maxMassIndex = i; } } index = maxMassIndex; visit[new_type][index] = true; //標識該糖果已被訪問 new_x +=fruit[new_type][index].mass; //更新x res ++; } } ans = max(ans,res); } cout<<ans<<endl; }