TCU
算法描述
- 在TCU大学,有许多不同的专业
- 每年,人们有可能从一个专业转到另一个专业
- 而且,TCU大学因为有“永不毕业的学生”而出名
- 你的任务是,给你一个专业列表,每个专业的初始进修人数,每个专业中转换专业的人数占比,计算出若干年后每个专业的进修人数
- 输入中会给出一系列百分比(percentages),代表这每年跳转到其他专业的人数百分比
- percentages中的每个元素是由空格分开的一系列整数,代表了每个专业的转出人数百分比
- 在start数组中,我们存储了每个专业的起始学生数目
- 例如,输入中给出percentages:{“90 10”,”05 95”} ,这就代表着:每年有10%的人从专业0转出到专业1,另外的90%的学生依旧留在专业0,同样的,每年有5%的人从专业1转到专业0,95%的学生依旧留在专业1
- 若是转出专业的人数做乘法后,得到的人数有小数部分,可以将小数部分直接去掉,分给那些留在此专业的人数
- 例如,有4.7个人想转出到别的专业,3.3个人想留在此专业,那么,计算结果应该是4个人转出到其他专业,4个人留在此专业————这样可以保证TCU大学的总人数不变
- 结合以上信息,以及转专业的总年数years,计算出years年之后,每个专业各有多少学生
参数定义
- 类名
TCU
- 方法
majors
- 输入参数
tor <string>, vector <int>, int
- 输出
vector <int>
- 方法声明
vetor <int> majors(vector <string> percentages, vector <int> start, int years)
限制条件
- percentages包含[1,20]个元素
- percentages中每个元素包含[1,50]个字符
- percentages中每个元素都是以空格划分的两个整数,不足部分可以0补齐
- percentages中的每个元素对应着每一门专业
- percentages中每个元素中的整数之和是100
- percentages中每个元素中的每个整数在[0,100]之间
- start中的每个元素大小在[0,1000000]之间
- start的元素个数与percentages的元素个数相同
- years在[0,10000]之间
例子
- 输入
- percentages: {“99 01”,”99 001”}
- start: {1000000,0}
- years: 2
- 输出
- { 990000, 10000 }
测试实例
测试实例
实例一
- 输入
- percentages: {“80 1 5 14”,”2 76 19 3”,”1 3 45 51”,”30 32 26 12”}
- start: {1237,625,9618,13476}
- years: 5
- 输出
- { 7497, 7212, 5533, 4714 }
- 输入
实例二
- 输入
- percentages: {“80 1 5 14”,”2 76 19 3”,”1 3 45 51”,”30 32 26 12”}
- start: {1237,625,9618,134760}
- years: 5
- 输出
- { 46162, 41768, 31364, 26946 }
- 输入
实例三
- 输入
- percentages: {” 00 100 “,” 100 0 “}
- start: {23,37}
- years: 999
- 输出
- { 37, 23 }
- 输入
代码
#include <iostream>
#include <string>
#include <vector>
#include <cmath>
using namespace std;
// -------------- start of solution ------------
class TCU {
public:
vector<int> majors(vector<string> percentages, vector<int> start, int years) {
int lenMajor = start.size();
vector<vector<int>> intPer(lenMajor, vector<int>(lenMajor));
for(int i = 0; i < lenMajor; i++) {
// gain the percentages of the people who enter and move out of the major
string myPer = percentages[i];
string strTmp = "";
int k = 0;
for(int j = 0; j < (int)myPer.length(); j++) {
if(' ' == myPer[j]) {
intPer[i][k] = stoi(strTmp);
k++;
strTmp.clear();
} else {
strTmp += myPer[j];
}
}
intPer[i][k] = stoi(strTmp);
}
for(int y = 0; y < years; y++) {
// the out number of people who change the major to other majors
vector<vector<int>> intOut(lenMajor, vector<int>(lenMajor));
for(int i = 0; i < lenMajor; i++) {
for(int j = 0; j < lenMajor; j++) {
intOut[i][j] = floor(start[i] * intPer[i][j] / 100);
}
}
// the people stay at the major who did not leave (when row = col)
for(int i = 0; i < lenMajor; i++) {
int sumTmp = 0;
for(int j = 0; j < lenMajor; j++) {
if(i != j)
sumTmp += intOut[i][j];
}
intOut[i][i] = start[i] - sumTmp;
}
// the number of people who will enter the i'th major
vector<int> enterMajor(lenMajor);
for(int i = 0; i < lenMajor; i++) {
int sumIn = 0;
for(int j = 0; j < lenMajor; j++) {
if(i != j)
sumIn += intOut[j][i];
}
enterMajor[i] = sumIn;
}
for(int i = 0; i < lenMajor; i++) {
start[i] = intOut[i][i] + enterMajor[i];
}
}
return start;
}
};
// -------------- end of solution --------------
int main() {
TCU tcu;
vector<string> percentages;
percentages.push_back("80 1 5 14");
percentages.push_back("2 76 19 3");
percentages.push_back("1 3 45 51");
percentages.push_back("30 32 26 12");
vector<int> start;
start.push_back(1237);
start.push_back(625);
start.push_back(9618);
start.push_back(13476);
int years = 5;
vector<int> ret = tcu.majors(percentages, start, years);
for(vector<int>::const_iterator iter = ret.cbegin(); iter < ret.cend(); iter++) {
cout << *iter << " ";
}
cout << endl;
cout.flush();
}