在 PFL 大街上有 n 个小朋友开了 n 家商店编号从 1 到 n。第 i 个小朋友只喜欢编号不是 i 的因数并且小于 i 的商店。为了保持友善每个小朋友都会按照编号从小到大依次去到所有自己喜欢的商店里购买一个商品无论对方喜不喜欢自己的商店。开始时所有商店都里没有商品。如果一个小朋友的商品不够了他们就需要进货。当然他们也可以卖掉自己买回来的商品。进货是一件麻烦的事所以小朋友们想让你求出他们一共最
#include <iostream>
#include <vector>
using namespace std;
// 计算因子个数
int countFactors(int n) {
int count = 0;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) {
count++;
}
}
return count;
}
// 计算最少需要进货的数量
int minStock(int n) {
vector<int> stock(n + 1, 0); // 商品库存
int minStock = 0;
for (int i = 2; i <= n; i++) {
int factors = countFactors(i);
if (factors > 0) {
// 需要进货的数量为因子个数减去当前库存
int requiredStock = factors - stock[i];
minStock += requiredStock;
// 将当前商品的数量分配给因子
int distributeStock = stock[i] / factors;
for (int j = 1; j < i; j++) {
if (i % j == 0) {
stock[j] += distributeStock;
}
}
// 将剩余的商品数量留给自己
stock[i] %= factors;
}
}
return minStock;
}
int main() {
int T;
cin >> T;
vector<int> results;
for (int i = 0; i < T; i++) {
int n;
cin >> n;
int result = minStock(n);
results.push_back(result);
}
for (int i = 0; i < T; i++) {
cout << results[i] << endl;
}
return 0;
}
首先,我们通过一个函数 countFactors 来计算一个数的因子个数。然后,我们通过一个函数 minStock 来计算最少需要进货的数量。
在 minStock 函数中,我们使用一个数组 stock 来记录每个商店的库存。初始时,所有商店的库存都为 0。
我们从第2个小朋友开始遍历到第 n 个小朋友。对于每个小朋友 i,我们首先计算出他的因子个数 factors。如果 factors 大于 0,说明小朋友 i 喜欢的商店存在,需要进货。
我们将需要进货的数量 requiredStock 累加到 minStock 中。然后,将当前商品的数量均分给因子,即将 stock[i] 分配给小于 i 的所有因子,并更新它们的库存。
最后,将剩余的商品数量留给自己,即 stock[i] %= factors。
在 main 函数中,我们先读入测试数据的组数 T,然后循环读入每组数据的 n。对于每组数据,我们调用 minStock 函数计算最少需要进货的数量,并将结果保存到一个结果数组中。
最后,我们循环输出结果数组中的每个结果
原文地址: https://www.cveoy.top/t/topic/iQGK 著作权归作者所有。请勿转载和采集!