题解详细说明:
2026-08-22 21:07:26
发布于:山西
1阅读
0回复
0点赞
题目题解
题意理解
给定n个整数,对于数组里每一个数字,看它后面所有的数,统计有多少个数字比它小。把所有位置统计出来的数量全部相加,输出这个总和。
样例输入:3个数 3,2,1
- 第一个数3,后面是2、1,两个数都比3小,计数+2
- 第二个数2,后面是1,1比2小,计数+1
- 第三个数1,后面没有数字,计数+0
总和 2+1+0 =3,对应样例输出3。
解题思路
- 读入n,再把n个数字全部存进一维数组。
- 设置总求和变量,初始值等于0,用来保存最终答案。
- 第一层循环,遍历每一个位置i,代表当前要处理的数字。i从第一个元素,一直到倒数第二个元素。最后一个元素后面没有数字,不用处理。
- 第二层循环,从i的下一个位置开始,遍历i后面全部数字。拿后面每一个数字和a[i]做比较。
- 如果后面这个数字小于a[i],就给总求和变量加1。
- 两层循环全部跑完之后,输出总和。
模拟完整样例过程
数组:[3,2,1]
总和初始=0
i=0,数字是3:
j=1,数字2<3 →总和变成1
j=2,数字1<3 →总和变成2
i=1,数字是2:
j=2,数字1<2 →总和变成3
i=2,是最后一个元素,不进入内层循环。
循环结束,输出总和3。
易错点
- 只看该数字后面的元素,前面的数字不要参与比较。
- 是统计个数,不是统计数字的差值,满足条件总和+1,不是加上数字本身。
- 最后一个元素后面没有数,不会产生贡献。
- n最大300,双重循环完全够用,不用担心超时。
输出要求
只输出最终累加得到的那一个整数。
所以,来看代码:
#include<bits/stdc++.h>
using namespace std;
int n,cnt1,cnt2;
int a[321];
int main()
{
cin>>n;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<n;++i)
{
cnt1=0;
for(int j=i;j<=n;++j) if(a[j]<a[i]) cnt1++;
cnt2+=cnt1;
}
cout<<cnt2;
}
全部评论 1
变了一下变量:
#include<bits/stdc++.h> using namespace std; int a[321]; int main() { int n,c,b; cin>>n; for(int i=1;i<=n;++i) cin>>a[i]; for(int i=1;i<n;++i) { c=0; for(int j=i;j<=n;++j) if(a[j]<a[i]) c++; b+=c; } cout<<b; }5天前 来自 山西
0








有帮助,赞一个