1、递增三元组
题目链接:递增三元组 - 蓝桥云课
输入示例:
3
1 1 1
2 2 2
3 3 3
输出示例:27
暴力解法:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int main()
{
long long n,ans=0;
int a[N],b[N],c[N];
cin>>n;
for(long long i=0;i<n;i++)
cin>>a[i];
for(long long i=0;i<n;i++)
cin>>b[i];
for(long long i=0;i<n;i++)
cin>>c[i];
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
for(int k=0;k<n;k++)
{
if(a[i]<b[j]&&b[j]<c[k])
ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
优化后:
#include <bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int main()
{
long long n,ans=0,s1=0,s2=0;
int a[N],b[N],c[N];
cin>>n;
for(long long i=0;i<n;i++)
cin>>a[i];
for(long long i=0;i<n;i++)
cin>>b[i];
for(long long i=0;i<n;i++)
cin>>c[i];
sort(a, a+n);
sort(b, b+n);
sort(c, c+n);
for(long long i=0;i<n;i++)
{
while(s1<n&&a[s1]<b[i]) s1++;
while(s2<n&&c[s2]<=b[i]) s2++;
ans += s1*(n-s2);
}
cout<<ans<<endl;
return 0;
}
2、扫地机器人
题目链接:扫地机器人 - 蓝桥云课
输入示例:
10 3
5
2
10
输出示例:6
完整代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int n,k,a[N];
bool check(int m)
{
int pos=0; //pos表示1~pos被清扫,pos+1~n未清扫
//遍历每个扫地机器人
for(int i=1;i<=k;i++)
{
int t=m;
//向左打扫
if(pos<a[i])
t-=(a[i]-pos-1)*2;
//打扫左边区域的时间不够
if(t<0) return false;
//如果左边全打扫完,向右打扫
pos=a[i]+t/2;
}
//没扫完,时间不够
if(pos<n) return false;
return true;
}
int main()
{
cin>>n>>k;
for(int i=1;i<=k;i++)
cin>>a[i];
sort(a+1,a+1+k);
int l=0,r=2*n,m=0,ans=2*n;
while(l<=r)
{
int m=(l+r)/2;
if(check(m))
{
r=m-1;
ans=m;
}
else l=m+1;
}
cout<<ans<<endl;
return 0;
}