Untitled

mail@pastecode.io avatar
unknown
plain_text
8 days ago
2.3 kB
3
Indexable
Never
#include <set>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int fee;
struct stone{
	int id;
	int cost;
	int content;
	int type;
	
	stone(int id, int type, int cost, int content) {
		this->id = id;
		this->cost = cost;
		this->content = content;
		this->type = type;
	}
};
stone del0 = stone(0, 0, 0, 0);
stone del1 = stone(0, 0, 0, 0);
stone del2 = stone(0, 0, 0, 0);
struct cmp{
	bool operator()(stone a, stone b) {
		return a.cost < b.cost;
	}
};

set<stone, cmp> table[3][3];

struct Result {
	int mCost;
	int mContent;
};

void init(int mShipFee) {
	for(int i=0; i<3; i++) {
		for(int j=0; j<3; j++) {
			table[i][j].clear();
		}
	}
	fee = mShipFee;
}

int gather(int mMineId, int mType, int mCost, int mContent) {
	stone tmp = stone(mMineId, mType, mCost, mContent);
	table[mMineId][mType].insert(tmp);
	table[2][mType].insert(tmp);
	return 0;
}

Result mix(int mBudget) {
	int row;
	Result res = {0, 0};
	int contentRes = -1;
	int costRes = 99999999;
	int contentCur, costCur;
	
	for(int i=0; i<3; i++) {
		auto stone0 = table[i][0].begin();
		auto stone1 = table[i][1].begin();
		auto stone2 = table[i][2].begin();
		while(stone0 != table[i][0].end() && stone1 != table[i][1].end() && stone2 != table[i][2].end()) {
			 if(i!=2) {
				 costCur = stone0->cost + stone1->cost + stone2->cost + fee;
			 } else {
				 costCur = stone0->cost + stone1->cost + stone2->cost + 2 * fee;
			 }
			 if(costCur <= mBudget) {
				 contentCur = min(stone0->content, stone1->content, stone2->content);
				 if(contentCur > contentRes || costCur < costRes) {
					 contentRes = contentCur;
					 costRes = costCur;
					 del0 = stone(stone0->id, stone0->type, stone0->cost, stone0->content);
					 del1 = stone(stone1->id, stone1->type, stone1->cost, stone1->content);
					 del2 = stone(stone2->id, stone2->type, stone2->cost, stone2->content);
					 row = i;
				 }
			 }
			 if(stone0->content == contentCur) stone0++;
			 else if(stone1->content == contentCur) stone1++;
			 else stone2++;
		}
	}

	table[row][0].erase(del0);
	table[row][1].erase(del1);
	table[row][2].erase(del2);
	table[2][0].erase(del0);
	table[2][1].erase(del1);
	table[2][2].erase(del2);
}
Leave a Comment