题目链接:哆啦A梦传送门
题意:
给出一串a[],从中找出最可能多的对 [ li,ri ] ,这些对的和(al+al+1+...+ar)都相等。
题解:
见网上代码:
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
map<int ,int > ma,item;
map<int,int >:: iterator it;
int n,a[100];
int main()
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++) ///枚举右端点
{
int sum=0;
for(int j=i;j;j--)///不能正向,因为正向的话,可能会有交集
{
sum+=a[j];
if(item[sum]<j){ ///之前的右端点要小于此时的左端点
item[sum]=i;
ma[sum]++;
}
}
}
// printf("ma=%d\n",ma[100]);
int ans=-1;///遍历找到集合最毒的边长
for(it=ma.begin();it!=ma.end();it++)
{
if(it->second>ma[ans]) ans=it->first;
}
printf("%d\n",ma[ans]);
// printf("ans=%d\n",ans);
int r=0;
for(int i=1;i<=n;i++)
{
int sum=0;
for(int j=i;j>r;j--){
sum+=a[j];
if(sum==ans){
printf("%d %d\n",j,i);
r=i;
}
}
}
return 0;
}
再来份比较骚的STL写法,不是我的,是网上神犇的,注明不了出处。、
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+5;
map<int,int>m;
int n,v[maxn];
int main(){
cin>>n;
for(int i=1;i<=n;i++)cin>>v[i],v[i]+=v[i - 1];
map<int,int>temp;
for(int i=1;i<=n;i++){
for(int j=i;j>=1;j--){
int res = v[i]-v[j-1];
if(temp[res]<j){
temp[res]=i;
m[res]++;
}
}
}
int ans=-1;
for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
if(it->second>m[ans])ans=it->first;
}
cout<<m[a ns]<<endl;
int r=0;
for(int i=1;i<=n;i++){
for(int j=i;j>r;j--){
if (v[i]-v[j-1]==ans){
r=i;
cout<<j<<' '<<i<<endl;
}
}
}
return 0;
}