#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#define DEBUGCOUT(x)
class Tea {
public:
long double volume;
long double temp;
Tea(int volume, int temp) {
this->volume = volume;
this->temp = temp;
}
};
const long double MIN_VALUE = std::numeric_limits<long double>::epsilon() * 10e6;
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int t;
cin >> t;
DEBUGCOUT(MIN_VALUE);
for (int i = 0; i < t; ++i) {
int teasCount;
std::vector<Tea> currentTeas, desiredTeas;
cin >> teasCount;
currentTeas.reserve(teasCount);
desiredTeas.reserve(teasCount);
for (int teaNumber = 0; teaNumber < teasCount; ++teaNumber) {
int volume, currentTemp, desiredTemp;
cin >> volume >> currentTemp >> desiredTemp;
currentTeas.push_back(Tea(volume, currentTemp));
desiredTeas.push_back(Tea(volume, desiredTemp));
}
sort(currentTeas.begin(), currentTeas.end(), [](Tea& tea1, Tea& tea2) {
return tea1.temp < tea2.temp;
});
sort(desiredTeas.begin(), desiredTeas.end(), [](Tea& tea1, Tea& tea2) {
return tea1.temp < tea2.temp;
});
Tea coldestTea = currentTeas[0];
unsigned int desiredPos(0), currentPos(1);
bool canRedistribute = true;
while (currentPos < currentTeas.size() && desiredPos < desiredTeas.size()) {
DEBUGCOUT("currentPos = " << currentPos << ", desiredPos = " << desiredPos);
Tea& desiredTea = desiredTeas[desiredPos];
Tea& currentTea = currentTeas[currentPos];
if (desiredTeas[desiredPos].temp < coldestTea.temp) {
DEBUGCOUT("desired tea is colder than the coldest tea");
canRedistribute = false;
break;
}
if (desiredTeas[desiredPos].temp >= currentTeas[currentPos].temp) {
// can't go to desired temp so mixing both teas
DEBUGCOUT("can't go to the desired temp so mixing both teas");
coldestTea.temp = (coldestTea.volume*coldestTea.temp + currentTea.volume*currentTea.temp)/(coldestTea.volume + currentTea.volume);
coldestTea.volume += currentTea.volume;
++currentPos;
break;
}
double neededCurrentTeaVolume = (desiredTea.temp - coldestTea.temp)*coldestTea.volume / (currentTea.temp - desiredTea.temp);
if (neededCurrentTeaVolume > currentTea.volume) {
// can't go to desired temp so mixing both teas
DEBUGCOUT("can't go to the desired temp so mixing both teas 2");
coldestTea.temp = (coldestTea.volume*coldestTea.temp + currentTea.volume*currentTea.temp) / (coldestTea.volume + currentTea.volume);
coldestTea.volume += currentTea.volume;
++currentPos;
break;
}
DEBUGCOUT("moving coldestTea to " << desiredTea.temp);
coldestTea.temp = desiredTea.temp;
coldestTea.volume += neededCurrentTeaVolume - desiredTea.volume;
currentTea.volume -= neededCurrentTeaVolume;
++desiredPos;
if (coldestTea.volume < -MIN_VALUE) canRedistribute = false;
}
if (currentPos >= currentTeas.size()) {
// We used all the teas and now the last desired should have the same temp and volume as coldest one
DEBUGCOUT("last desired tea left");
canRedistribute = canRedistribute && abs(coldestTea.volume - desiredTeas[desiredPos].volume) < MIN_VALUE
&& abs(coldestTea.temp - desiredTeas[desiredPos].temp) < MIN_VALUE && desiredPos == desiredTeas.size() - 1;
} else if (desiredPos >= desiredTeas.size()) {
// We mixed all the desired teas and now the coldest tea should have 0 volume
DEBUGCOUT("last current tea left");
DEBUGCOUT("Coldest tea volume: " << coldestTea.volume);
canRedistribute = canRedistribute && abs(coldestTea.volume) < MIN_VALUE;
}
cout << (canRedistribute ? "TAK" : "NIE") << "\n";
DEBUGCOUT("==================\n==================\n==================\n==================\n");
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | #include <iostream> #include <vector> #include <algorithm> using namespace std; #define DEBUGCOUT(x) class Tea { public: long double volume; long double temp; Tea(int volume, int temp) { this->volume = volume; this->temp = temp; } }; const long double MIN_VALUE = std::numeric_limits<long double>::epsilon() * 10e6; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int t; cin >> t; DEBUGCOUT(MIN_VALUE); for (int i = 0; i < t; ++i) { int teasCount; std::vector<Tea> currentTeas, desiredTeas; cin >> teasCount; currentTeas.reserve(teasCount); desiredTeas.reserve(teasCount); for (int teaNumber = 0; teaNumber < teasCount; ++teaNumber) { int volume, currentTemp, desiredTemp; cin >> volume >> currentTemp >> desiredTemp; currentTeas.push_back(Tea(volume, currentTemp)); desiredTeas.push_back(Tea(volume, desiredTemp)); } sort(currentTeas.begin(), currentTeas.end(), [](Tea& tea1, Tea& tea2) { return tea1.temp < tea2.temp; }); sort(desiredTeas.begin(), desiredTeas.end(), [](Tea& tea1, Tea& tea2) { return tea1.temp < tea2.temp; }); Tea coldestTea = currentTeas[0]; unsigned int desiredPos(0), currentPos(1); bool canRedistribute = true; while (currentPos < currentTeas.size() && desiredPos < desiredTeas.size()) { DEBUGCOUT("currentPos = " << currentPos << ", desiredPos = " << desiredPos); Tea& desiredTea = desiredTeas[desiredPos]; Tea& currentTea = currentTeas[currentPos]; if (desiredTeas[desiredPos].temp < coldestTea.temp) { DEBUGCOUT("desired tea is colder than the coldest tea"); canRedistribute = false; break; } if (desiredTeas[desiredPos].temp >= currentTeas[currentPos].temp) { // can't go to desired temp so mixing both teas DEBUGCOUT("can't go to the desired temp so mixing both teas"); coldestTea.temp = (coldestTea.volume*coldestTea.temp + currentTea.volume*currentTea.temp)/(coldestTea.volume + currentTea.volume); coldestTea.volume += currentTea.volume; ++currentPos; break; } double neededCurrentTeaVolume = (desiredTea.temp - coldestTea.temp)*coldestTea.volume / (currentTea.temp - desiredTea.temp); if (neededCurrentTeaVolume > currentTea.volume) { // can't go to desired temp so mixing both teas DEBUGCOUT("can't go to the desired temp so mixing both teas 2"); coldestTea.temp = (coldestTea.volume*coldestTea.temp + currentTea.volume*currentTea.temp) / (coldestTea.volume + currentTea.volume); coldestTea.volume += currentTea.volume; ++currentPos; break; } DEBUGCOUT("moving coldestTea to " << desiredTea.temp); coldestTea.temp = desiredTea.temp; coldestTea.volume += neededCurrentTeaVolume - desiredTea.volume; currentTea.volume -= neededCurrentTeaVolume; ++desiredPos; if (coldestTea.volume < -MIN_VALUE) canRedistribute = false; } if (currentPos >= currentTeas.size()) { // We used all the teas and now the last desired should have the same temp and volume as coldest one DEBUGCOUT("last desired tea left"); canRedistribute = canRedistribute && abs(coldestTea.volume - desiredTeas[desiredPos].volume) < MIN_VALUE && abs(coldestTea.temp - desiredTeas[desiredPos].temp) < MIN_VALUE && desiredPos == desiredTeas.size() - 1; } else if (desiredPos >= desiredTeas.size()) { // We mixed all the desired teas and now the coldest tea should have 0 volume DEBUGCOUT("last current tea left"); DEBUGCOUT("Coldest tea volume: " << coldestTea.volume); canRedistribute = canRedistribute && abs(coldestTea.volume) < MIN_VALUE; } cout << (canRedistribute ? "TAK" : "NIE") << "\n"; DEBUGCOUT("==================\n==================\n==================\n==================\n"); } } |
English