此题本身不难,因为对于输入,只有6种可能的组合。直接用暴力法枚举所有可能就可以了。 主要的问题在于保证输出所有最优解中字典序最少的一个。 返回 Volume I 索引 返回总索引 // 102_Ecological_Bin_Packing.cpp : Defines the entry point for the console application. // #include <set> #include <map> #include <list> #include <queue> #include <stack> #include <vector> #include <string> #include <sstream> #include <cstdio> #include <cmath> #include <limits> #include <utility> #ifndef ONLINE_JUDGE #include <fstream> std::ifstream cin("in.txt"); std::ofstream cout("out.txt"); // std::ofstream cout(stdout); #else #include <iostream> #endif typedef long long llong; typedef unsigned long long ullong; typedef long double ldouble; using namespace std; #define BROWN 0 #define CLEAR 2 #define GREEN 1 #define SUM 3 vector<vector<int> > recycleBins(3); int CountMoves(int c1, int c2, int c3) { return recycleBins[0][SUM] - recycleBins[0][c1] + recycleBins[1][SUM] - recycleBins[1][c2] + recycleBins[2][SUM] - recycleBins[2][c3]; } int moveType[6][3] = { { BROWN, CLEAR, GREEN }, { BROWN, GREEN, CLEAR }, { CLEAR, BROWN, GREEN }, { CLEAR, GREEN, BROWN }, { GREEN, BROWN, CLEAR }, { GREEN, CLEAR, BROWN }, }; char colorNames[] = "BGC"; int main(int argc, char* argv[]) { bool bFinished = false; recycleBins[0].resize(4); recycleBins[1].resize(4); recycleBins[2].resize(4); for(;;) { for(int i = 0; i < 3 && !bFinished; ++i) { recycleBins[i][SUM] = 0; for(int j = 0; j < 3; ++j) { if(!(cin>> recycleBins[i][j])) { bFinished = true; break; } recycleBins[i][SUM] += recycleBins[i][j]; } } if(bFinished) break; int minMove = numeric_limits<int>::max(); int minIndex = -1; for(int i = 0; i < 6; ++i) { int moves = CountMoves(moveType[i][0], moveType[i][1], moveType[i][2]); if(moves < minMove) { minMove = moves; minIndex = i; } } for(int i = 0; i < 3; ++i) cout<< colorNames[ moveType[minIndex][i] ]; cout<< " "<< minMove<< "/n"; } return 0; } 102 - Ecological Bin Packing