连号区间
设两层循环,一层i表示左端点,第二层j表示右端点。如果要保持连续性的话那么有一个思路:因为是连续的所以在所取的[l,r]范围中寻找最大值,最小值。然后相减,最后和r-l(区间长度)作比较即可。
因为是排序 所以数字不会重复
#include<bits/stdc++.h>
using namespace std;
int n;
const int N=11000,INF=100000000;
int a[N],res=0;
int main()
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++)//枚举区间左端点
{
int max1=-INF, min1= INF;
for(int j=i;j<=n;j++)//枚举区间右端点
{
max1=max(max1,a[j]);
min1=min(min1,a[j]);
if(max1-min1==j-i) res++;
}
}
cout<<res<<endl;
}
递增三元组
暴力
#include <iostream>
using namespace std;
int main() //暴力
{
int n;
cin>>n;
int a[n],b[n],c[n];
int res=0;
for(int i=0; i<n;i++) cin>>a[i];
for(int j=0; j<n;j++) cin>>b[j];
for(int k=0; k<n;k++) cin>>c[k];
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])
res ++;
}
}
cout<<res<<endl;
return 0;
}
前缀和
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int n;
int a[N], b[N], c[N];
int as[N]; // as[i]表示在A[]中有多少个数小于b[i]
int cs[N]; // cs[i]表示在C[]中有多少个数大于b[i]
int cnt[N];//表示每个数出现多少次
int s[N];//前缀和数组
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]), a[i] ++ ; //a[i]记得+1 ,从1开始避免特例
for (int i = 0; i < n; i ++ ) scanf("%d", &b[i]), b[i] ++ ;
for (int i = 0; i < n; i ++ ) scanf("%d", &c[i]), c[i] ++ ;
// 求as[]
for (int i = 0; i < n; i ++ ) cnt[a[i]] ++ ; //a 出现次数
for (int i = 1; i < N; i ++ ) s[i] = s[i - 1] + cnt[i]; // 求cnt[]的前缀和
for (int i = 0; i < n; i ++ ) as[i] = s[b[i] - 1];
// 求cs[]
memset(cnt, 0, sizeof cnt);//先清空cnt cs[]
memset(s, 0, sizeof s);
for (int i = 0; i < n; i ++ ) cnt[c[i]] ++ ;
for (int i = 1; i < N; i ++ ) s[i] = s[i - 1] + cnt[i];
for (int i = 0; i < n; i ++ ) cs[i] = s[N - 1] - s[b[i]];
// 枚举每个b[i]
LL res = 0;
for (int i = 0; i < n; i ++ ) res += (LL)as[i] * cs[i];//相乘得出结果
cout << res << endl;
return 0;
}
特别数的和
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
int res=0;
for(int i=1; i<=n; i++)
{
int x=i;
while(x>0)
{
int t;
t=x%10; //取个位
x/=10; //删掉个位
if(t==2 ||t==0 ||t==1 || t==9)
{
res+=i;
break;
}
}
}
cout<<res<<endl;
return 0;
}
主要是输入难 n 行数据
#include <cstring>
#include <sstream>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 10010;
int n;
int a[N];
int main()
{
int cnt;
cin >> cnt;
string line;
getline(cin, line); // 忽略掉第一行的回车
while (cnt -- )
{
getline(cin, line);
stringstream ssin(line);
while (ssin >> a[n]) n ++ ;
}
sort(a, a + n);
int res1, res2;
for (int i = 1; i < n; i ++ )
if (a[i] == a[i - 1]) res2 = a[i]; // 重号
else if (a[i] >= a[i - 1] + 2) res1 = a[i] - 1; // 断号
cout << res1 << ' ' << res2 << endl;
return 0;
}
#include <iostream>
#include <algorithm>
using namespace std;
int n;
const int N = 1e5+10;
int a[N];
int main()
{
cin>>n;
int i=0;
while(cin>>a[i]){
i++;
}
sort(a,a+i);//快速排序
int duan,chong;
for(int j=0;j<i;j++)
{
if(a[j]==a[j+1]) chong=a[j] ;//排完序后 重号连续在一起
if(a[j]==a[j+1]-2) duan = a[j]+1;
}
cout<<duan<<' '<<chong<<endl;
}