顺序三元组
2023-02-18 16:35:27 时间
顺序三元组
给定一个长度为 N 的数组 A=[A_1, A_2, ... A_N],已知其中每个元素 Ai 的值都只可能是 1, 2 或者 3。
请求出有多少下标三元组 (i, j, k)满足 1≤i<j<k≤N 且 Ai<Aj<Ak。
输入格式
第一行包含一个整数 N;
第二行包含 N 个整数A1,A2,...AN。(1≤Ai≤3,1≤N≤100000)。
输出格式
一个整数表示答案。
样例输入
6
1 3 2 1 2 3
样例输出
3
代码:
1)未优化前的代码:暴力破解
思路:从第一个数A1之后找第二个大于A1的数A2,再在A2之后找一个大于A2的数
#include<iostream>
using namespace std;
int main(){
int n;
cin>>n;
int *arr=new int[n];
for (size_t i = 0; i < n; i++)
{
cin>>arr[i];
}
int count=0;
for (int i = 0; i < n-2; i++)
{
for (int j = i+1; j <n-1 ; j++)
{
for (int k = j+1; k <n ; k++)
{
if (arr[i]<arr[j]&&arr[j]<arr[k])
{
count++;
}
}
}
}
cout<<count<<endl;
}
2)优化后:
#include <iostream>
using namespace std;
int main(){
long long N;
cin>>N;
int *in = new int[N+1];
long long a=0,b=0,c=0;
// a是记录1的个数,c是记录3的个数
for(long long i=0;i<N;i++)
{
cin>>in[i];
if(in[i]==3)c++;
}
long long ans=0;
for(long long i=0;i<N;i++)
{
if(in[i]==1)a++;
if(in[i]==3)c--;
if(in[i]==2){
//以2为中间点,由2之前1的个数与2之后3的个数计算递增三元组组合
ans+=a*c;
}
}
cout<<ans<<endl;
}
相关文章
- 玩好.NET高级调试,你也要会写点汇编
- 记一次 .NET 某工控软件 内存泄露分析
- 记一次 .NET 某电子厂OA系统 非托管内存泄露分析
- 聊一聊如何截获 C# 程序产生的日志
- .NET 7 的 AOT 到底能不能扛反编译?
- 记一次 .NET 某自动化采集软件 崩溃分析
- 从 WinDbg 角度理解 .NET7 的AOT玩法
- 记一次.NET某工控图片上传CPU爆高分析
- WinDBG详解进程初始化dll是如何加载的
- 一个超经典 WinForm 卡死问题的再反思
- 聊一聊对一个 C# 商业程序的反反调试
- 记一次 .NET 某医疗器械 程序崩溃分析
- 记一次 .NET 某娱乐聊天流平台 CPU 爆高分析
- 聊一聊被 .NET程序员 遗忘的 COM 组件
- 记一次 .NET 某企业OA后端服务 卡死分析
- 记一次 .NET 某电子病历 CPU 爆高分析
- 记一次某制造业ERP系统 CPU打爆事故分析
- 记一次 .NET 某工控视觉软件 非托管泄漏分析
- 从 C# 崩溃异常 中研究页堆布局
- TTD 专题 (第一篇):C# 那些短命线程都在干什么?