SRM 219 Div II Level Two: HealthFood
2013-07-15 22:06
661 查看
题目来源:http://community.topcoder.com/stat?c=problem_statement&pm=3118
方法比较直接,用swicth判断选择标准,如果结果唯一的话,则返回,否则判断下一个标准!
代码如下:
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class HealthFood {
private:
vector <int> getH(vector <int> &carbs, vector <int> &indexs)
{
vector <int> ans;
int maxc = -1;
for (int i = 0; i < indexs.size(); i++) {
if (carbs[ indexs[i] ] > maxc) {
maxc = carbs[ indexs[i] ];
}
}
for (int i = 0; i < indexs.size(); i++) {
if (maxc == carbs[ indexs[i] ]) {
ans.push_back(indexs[i]);
}
}
return ans;
}
vector <int> getL(vector <int> &carbs, vector <int> &indexs)
{
vector <int> ans;
int minc = 1000;
for (int i = 0; i < indexs.size(); i++) {
if (carbs[ indexs[i] ] < minc) {
minc = carbs[ indexs[i] ];
}
}
for (int i = 0; i < indexs.size(); i++) {
if (minc == carbs[ indexs[i] ]) {
ans.push_back(indexs[i]);
}
}
return ans;
}
vector <int> getHT(vector <int> &protein, vector <int> &carbs, vector <int> &fat, vector <int> &indexs)
{
vector <int> ans;
vector <int> total(protein.size());
int maxt = -1;
for (int k = 0; k < protein.size(); k++) {
total[k] = 5 * (protein[k] + carbs[k]) + 9 * fat[k];
}
for (int i = 0; i < indexs.size(); i++) {
if (total[ indexs[i] ] > maxt) {
maxt = total[ indexs[i] ];
}
}
for (int i = 0; i < indexs.size(); i++) {
if (maxt == total[ indexs[i] ]) {
ans.push_back(indexs[i]);
}
}
return ans;
}
vector <int> getLT(vector <int> &protein, vector <int> &carbs, vector <int> &fat, vector <int> &indexs)
{
vector <int> ans;
vector <int> total(protein.size());
int mint = 1000000;
for (int i = 0; i < protein.size(); i++) {
total[i] = 5 * (protein[i] + carbs[i]) + 9 * fat[i];
}
for (int i = 0; i < indexs.size(); i++) {
if (total[ indexs[i] ] < mint) {
mint = total[ indexs[i] ];
}
}
for (int i = 0; i < indexs.size(); i++) {
if (mint == total[ indexs[i] ]) {
ans.push_back(indexs[i]);
}
}
return ans;
}
public:
vector <int> selectMeals(vector <int> protein, vector <int> carbs, vector <int> fat, vector <string> dietPlans) {
vector <int> res;
int plan_num = dietPlans.size();
for (int i = 0; i < plan_num; i++) {
if ("" == dietPlans[i]) {
res.push_back(0);
continue;
}
vector <int> indexs;
for (int k = 0; k < protein.size(); k++) {
indexs.push_back(k);
}
bool flag = false;
for (int j = 0; j < dietPlans[i].size(); j++) {
switch (dietPlans[i][j]) {
case 'C':
indexs = getH(carbs, indexs);
break;
case 'c':
indexs = getL(carbs, indexs);
break;
case 'P':
indexs = getH(protein, indexs);
break;
case 'p':
indexs = getL(protein, indexs);
break;
case 'F':
indexs = getH(fat, indexs);
break;
case 'f':
indexs = getL(fat, indexs);
break;
case 'T':
indexs = getHT(protein, carbs, fat, indexs);
break;
case 't':
indexs = getLT(protein, carbs, fat, indexs);
break;
}
if (1 == indexs.size()) {
res.push_back(indexs[0]);
flag = true;
} else {
if (j == dietPlans[i].size() - 1) {
res.push_back(indexs[0]);
flag = true;
} else {
continue;
}
}
if (flag) {
break;
}
}
}
return res;
}
};
方法比较直接,用swicth判断选择标准,如果结果唯一的话,则返回,否则判断下一个标准!
代码如下:
#include <algorithm>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class HealthFood {
private:
vector <int> getH(vector <int> &carbs, vector <int> &indexs)
{
vector <int> ans;
int maxc = -1;
for (int i = 0; i < indexs.size(); i++) {
if (carbs[ indexs[i] ] > maxc) {
maxc = carbs[ indexs[i] ];
}
}
for (int i = 0; i < indexs.size(); i++) {
if (maxc == carbs[ indexs[i] ]) {
ans.push_back(indexs[i]);
}
}
return ans;
}
vector <int> getL(vector <int> &carbs, vector <int> &indexs)
{
vector <int> ans;
int minc = 1000;
for (int i = 0; i < indexs.size(); i++) {
if (carbs[ indexs[i] ] < minc) {
minc = carbs[ indexs[i] ];
}
}
for (int i = 0; i < indexs.size(); i++) {
if (minc == carbs[ indexs[i] ]) {
ans.push_back(indexs[i]);
}
}
return ans;
}
vector <int> getHT(vector <int> &protein, vector <int> &carbs, vector <int> &fat, vector <int> &indexs)
{
vector <int> ans;
vector <int> total(protein.size());
int maxt = -1;
for (int k = 0; k < protein.size(); k++) {
total[k] = 5 * (protein[k] + carbs[k]) + 9 * fat[k];
}
for (int i = 0; i < indexs.size(); i++) {
if (total[ indexs[i] ] > maxt) {
maxt = total[ indexs[i] ];
}
}
for (int i = 0; i < indexs.size(); i++) {
if (maxt == total[ indexs[i] ]) {
ans.push_back(indexs[i]);
}
}
return ans;
}
vector <int> getLT(vector <int> &protein, vector <int> &carbs, vector <int> &fat, vector <int> &indexs)
{
vector <int> ans;
vector <int> total(protein.size());
int mint = 1000000;
for (int i = 0; i < protein.size(); i++) {
total[i] = 5 * (protein[i] + carbs[i]) + 9 * fat[i];
}
for (int i = 0; i < indexs.size(); i++) {
if (total[ indexs[i] ] < mint) {
mint = total[ indexs[i] ];
}
}
for (int i = 0; i < indexs.size(); i++) {
if (mint == total[ indexs[i] ]) {
ans.push_back(indexs[i]);
}
}
return ans;
}
public:
vector <int> selectMeals(vector <int> protein, vector <int> carbs, vector <int> fat, vector <string> dietPlans) {
vector <int> res;
int plan_num = dietPlans.size();
for (int i = 0; i < plan_num; i++) {
if ("" == dietPlans[i]) {
res.push_back(0);
continue;
}
vector <int> indexs;
for (int k = 0; k < protein.size(); k++) {
indexs.push_back(k);
}
bool flag = false;
for (int j = 0; j < dietPlans[i].size(); j++) {
switch (dietPlans[i][j]) {
case 'C':
indexs = getH(carbs, indexs);
break;
case 'c':
indexs = getL(carbs, indexs);
break;
case 'P':
indexs = getH(protein, indexs);
break;
case 'p':
indexs = getL(protein, indexs);
break;
case 'F':
indexs = getH(fat, indexs);
break;
case 'f':
indexs = getL(fat, indexs);
break;
case 'T':
indexs = getHT(protein, carbs, fat, indexs);
break;
case 't':
indexs = getLT(protein, carbs, fat, indexs);
break;
}
if (1 == indexs.size()) {
res.push_back(indexs[0]);
flag = true;
} else {
if (j == dietPlans[i].size() - 1) {
res.push_back(indexs[0]);
flag = true;
} else {
continue;
}
}
if (flag) {
break;
}
}
}
return res;
}
};
相关文章推荐
- SRM 219 Div II Level One: WaiterTipping,小心约分
- SRM 579 Div II Level Two: UndoHistory
- SRM 577 Div II Level Two: EllysRoomAssignmentsDiv2
- SRM 578 Div II Level Three: WolfInZooDivTwo,Dynamic Programming,求教!
- SRM 207 Div II Level Two: RegularSeason,字符串操作(sstream),多关键字排序( 比较函数 )
- SRM 223 Div II Level Two: BlackAndRed,O(N)复杂度
- SRM 233 Div II Level Two: PipeCuts
- SRM 299 Div II Level Two: Projections
- SRM 219 Div II Level One: WaiterTipping,小心约分
- SRM 212 Div II Level Two: WinningRecord,Brute Force
- SRM 584 Div II Level Two: Egalitarianism,DFS,BFS算法
- SRM 578 Div II Level Two: GooseInZooDivTwo, DFS
- SRM 212 Div II Level Two: WinningRecord,Brute Force
- SRM 222 Div II Level Two: GroceryBagger,STL map 用法
- SRM 207 Div II Level Two: RegularSeason,字符串操作(sstream),多关键字排序(操作符重载)
- SRM 223 Div II Level Two: BlackAndRed,O(N)复杂度
- SRM 483 Div II Level Two: MovieSeating, TopCoder上正确率不到%10的题
- SRM 585 Div II Level Two: TrafficCongestionDivTwo
- SRM 577 Div II Level Two: EllysRoomAssignmentsDiv2
- SRM 583 Div II Level Three:GameOnABoard,Dijkstra最短路径算法