#include #include #include #include #include using namespace std; struct Input { vector> rows; int N; int M; int B; }; vector subtract(vector row1, vectorrow2) { vector result; int size = row1.size(); for (int i = 0; i < size; i++) { result.push_back(row1[i] - row2[i]); } return result; } Input getInput() { string inputFilePath = "subsetselection.in"; string delimiter = " "; string line; int N = 0; int M = 0; int B = 0; vector> inputRows; ifstream inputFile(inputFilePath); if (inputFile.is_open()) { bool firstLine = true; while (getline(inputFile, line)) { size_t pos = 0; string token; vector currentLineData; line.append(delimiter); while ((pos = line.find(delimiter)) != string::npos) { token = line.substr(0, pos); int currentNumber = atoi(token.c_str()); currentLineData.push_back(currentNumber); line.erase(0, pos + delimiter.length()); } if (firstLine) { N = currentLineData[0]; M = currentLineData[1]; B = currentLineData[2]; firstLine = false; } else { inputRows.push_back(currentLineData); } } inputFile.close(); } else cout << "Unable to open file"; return Input{ inputRows, N, M, B }; } void writeOutput(vector output) { string outputFilePath = "subsetselection.out"; ofstream outputFile(outputFilePath); if (outputFile.is_open()) { int outputSize = output.size(); outputFile << outputSize; for (int i = 0; i < outputSize; i++) { outputFile << "\n" << output[i]; } outputFile.close(); } else cout << "Unable to open file"; } vector getBestSum(int M, int B) { vector bestSum; for (int i = 0; i < M; i++) { bestSum.push_back(B - 1); } return bestSum; } vector getZeroRow(int M) { vector zeroRow; for (int i = 0; i < M; i++) { zeroRow.push_back(0); } return zeroRow; } int main(int argc, char* argv[]) { Input input = getInput(); vector bestSum = getBestSum(input.M, input.B); vector zeroRow = getZeroRow(input.M); vector output; vector subtractedRow = bestSum; vector previousSubtractedRow = bestSum; for (int i = 0; i < input.N; i++) { if (input.rows[i] != zeroRow) { subtractedRow = subtract(subtractedRow, input.rows[i]); if (subtractedRow > zeroRow) { output.push_back(i+1); } else if (subtractedRow < zeroRow) { subtractedRow = previousSubtractedRow; } else if (subtractedRow == zeroRow) { output.push_back(i+1); break; } previousSubtractedRow = subtractedRow; } } writeOutput(output); return 0; }