算法七

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();
}
点赞