1 | 递增三元组
题目
给定三个整数数组
A = [A1, A2, ... AN],
B = [B1, B2, ... BN],
C = [C1, C2, ... CN],
请你统计有多少个三元组(i, j, k) 满足:
1 <= i, j, k <= N
Ai < Bj < Ck
输入格式
第一行包含一个整数N。
第二行包含N个整数A1, A2, … AN。
第三行包含N个整数B1, B2, … BN。
第四行包含N个整数C1, C2, … CN。
对于30%的数据,1 <= N <= 100
对于60%的数据,1 <= N <= 1000
对于100%的数据,1 <= N <= 100000 0 <= Ai, Bi, Ci <= 100000
输出格式
一个整数表示答案
例子
输入
3
1 1 1
2 2 2
3 3 3
输出
27
思路
只需要对比前后两个元素的大小关系,累加个数即可
逻辑代码
int IncTriples(int i_uNum, vector<vector<int> >& i_uArr)
{
int res = -1;
if (1 > i_uNum)
{
return res;
}
res = 0;
for (int i = 0; i < i_uNum; i++)
{
for (int j = 0; j < i_uNum; j++)
{
for (int k = 0; k < i_uNum; k++)
{
if ((i_uArr[0][i] <= i_uArr[1][j]) && (i_uArr[1][j] <= i_uArr[2][k]))
{
res++;
}
}
}
}
return res;
}
2 | 比酒量
题目
有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下,有几个人倒下了。再打开一瓶酒平分,又有倒下的, 再次重复…
直到开了第4瓶酒,坐着的已经所剩无几,海盗船长也在其中。当第4瓶酒平分喝下后,大家都倒下了。
等船长醒来,发现海盗船搁浅了。他在航海日志中写到:“…昨天,我正好喝了一瓶…奉劝大家,开船不喝酒,喝酒别开船…”
请你根据这些信息,推断开始有多少人,每一轮喝下来还剩多少人。
如果有多个可能的答案,请列出所有答案,每个答案占一行。
格式是:人数,人数,…
例如,有一种可能是:20,5,4,2,0
思路
理解题目,得到三个关键点
- 不多于20人 --> 第一轮最多20人
- 第四瓶酒后全倒下了 --> 一共只喝了四轮
- 船长正好喝了一瓶,且是最后一轮倒下的 --> 四轮下来,船长分到的酒刚好一瓶
从这三个关键点,很好得出这个数学题的解题思路 —— 计算从第一轮开始,每一轮都少N个人,计算最后是否加起来的酒等于1瓶
- 第一轮酒最多20人
- 第二轮最多也比第一轮少一人
- 第三轮最多也比第二轮少一人
- 第四轮最多也比第三轮少一人
- 判断这四轮加起来船长分到的酒是否等于一瓶
逻辑代码
void CompareWineCapacity()
{
for (int i = 20; i >= 4; i--)
{
for (int j = 4; j < i; j++)
{
for (int k = 3; k < j; k++)
{
for (int l = 2; l < k; l++)
{
int Denominator = i * j * k * l;
int Molecular = (j * k * l) + (i * k * l) + (i * j * l) + (i * j * k);
if (Denominator == Molecular)
{
cout << "res = [" << i << " " << j << " " << k << " " << l << "]" << endl;
}
}
}
}
}
}
3 | 成绩分析
题目
小蓝给学生们组织了一场考试,卷面总分为100分,每个学生的得分都是一个0到100的整数。
请计算这次考试的最高分、最低分和平均分。
输入格式
输入的第一行包含一个整数n,表示考试人数。
接下来n行,每行包含一个0至100的整数,表示一个学生的得分。
输出格式
输出三行。
第一行包含一个整数,表示最高分。
第二行包含一个整数,表示最低分。
第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。
例子
输入
7
80
92
56
74
88
99
10
输出
99
10
71.29
思路
两个思路
- 先统计成绩总和,再对成绩进行排序得出最高分和最低分,再求平均分
- 边记录最高分最低分,边统计成绩总和,最后求平均分
逻辑代码
void LQ_Simple::PerformanceAnalysis(vector<int>& i_uArr)
{
int len = i_uArr.size();
if (0 == len)
{
cout << "Input parameter is unvalid." << endl;
return;
}
int solution = 0;
int ScoreMax = 0;
int ScoreMin = 100;
int ScoreSum = 0;
float ScoreAver = 0.00;
cout << "Please select Solutions[1, 2]: ";
cin >> solution;
switch (solution)
{
case 1:
{
for (int i = 0; i < len; i++)
{
ScoreSum += i_uArr[i];
}
Sort(i_uArr);
ScoreMax = i_uArr[0];
ScoreMin = i_uArr[len - 1];
ScoreAver = ((float)ScoreSum / len);
}
break;
case 2:
{
for (int i = 0; i < len; i++)
{
ScoreSum += i_uArr[i];
if (ScoreMax < i_uArr[i])
{
ScoreMax = i_uArr[i];
}
if (ScoreMin > i_uArr[i])
{
ScoreMin = i_uArr[i];
}
}
ScoreAver = ((float)ScoreSum / len);
}
break;
default:
break;
}
cout << "The highest score = [" << ScoreMax << "]." << endl;
cout << "The lowest score = [" << ScoreMin << "]." << endl;
cout << "The average score = [" << fixed << setprecision(2) << ScoreAver << "]." << endl;
}