Zepto Code Rush 2014 A. Feed with Candy

OpenSoucre發表於2014-06-14

此題用貪心求解,

首先將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; }

 

 

相關文章