1 最佳速通时间
小C准备参加某个游戏的速通比赛,为此他对该游戏速通了 n次,每次速通记录可以用一个数组 A={a1,a2……am}表示,其中a表示小C 从游戏开始到第i个游戏节点所花赛的时间,m 为游戏节点的个数。请根据小 C 的速通记录计算出他的理论最佳速通时间,理论最佳速通时问指:小C在每两个相邻的游戏节点之间所花费的时间均达到了历史最佳记录,在此情况下所花费的总时间。
输入描述
第一行两个正整数 n,m,表示有 n个速通记录,每个速通记录有 m 个游戏节点接下来n行,每行 m 个正整数,第i行的第j个数 aij表示在第i次速通记录中,从游戏开始到第j个游戏节点所花费的时间。
对于第i行数据 ai1,ai2,…, aim,满足0 < ai1 < ai2<… < aim
数据保证:1≤n≤300,1≤m≤300,1≤aij≤100 000 00
输出描述
一行一个整数,表示理论的最佳速通时间。
样例输入
3 5
1 4 7 9 13
2 3 8 11 14
1 3 7 12 13
样例输出
8
思路与代码:
初始化一个长度为 m 的数组 a,用于存储每个游戏节点之间的最小时间差。初始值设为无穷大。初始化变量 s 用于累加理论最佳速通时间。
遍历每次速通记录:对于每次速通记录,遍历每个游戏节点。计算当前游戏节点与前一个游戏节点之间的时间差,并与 a 数组中对应位置的值进行比较,取最小值。如果当前是最后一次速通记录,则将 a 数组中的值累加到 s 中。
void theBestTime() {
int m = 0, n = 0;
cin >> m;
cin >> n;
vector<vector<long long>> records;
for (int i = 0; i < m; i++){
vector<long long> record;
for (int j = 0; j < n; j++){
int tem = 0;
cin >> tem;
record.push_back(tem);
}
records.push_back(record);
}
vector<long long> minTimes(n,1e9);
long long sumNum = 0;
for (int i = 0; i < m; i++) {
long long pre = 0;
for (int j = 0; j < n; j++) {
minTimes[j] = min(records[i][j]-pre,minTimes[j]);
pre = records[i][j];
if (i==m-1) sumNum += minTimes[j];
}
}
cout << sumNum << endl;
}
2 对比之美
思路与代码:
思维题,显然题目把三种情况都告诉了,只有一个格子,直接输出0,两个格子,直接输出m。
大于两个格子的时候,直接输出2 * m,即 0 m 0 0 0 0 0
void compareBeauty() {
int T = 0;
cin >> T;
vector<vector<long long>> gridColleVec(T,vector<long long>(2));
for (int i = 0; i < T; i++){
cin >> gridColleVec[i][0];
cin >> gridColleVec[i][1];
int beauty = 0;
if (gridColleVec[i][0] == 1) {
beauty = 0;
}
else if (gridColleVec[i][0] == 2){
beauty = gridColleVec[i][1];
}
else if (gridColleVec[i][0] > 2) {
beauty = gridColleVec[i][1]*2;
}
cout << beauty<<" ";
}
cout << endl;
}