一、链接
二、题目
题目描述
MoveToEx找到了很多不同颜色的珠子,他把这些珠子排成了一列,每个珠子的颜色用1,2....表示.定义一个区间的美观度为区间中不同颜色的珠子个数现在MoveToEx想知道,在所有n×(n+1)/2 个区间中,所有区间的美观度之和是多少.
输入描述:
输入数据有两行,第一行有一个整数n,表示珠子的个数 第二行有n个正整数,表示每个珠子的颜色
输出描述:
输出一个整数,表示所有区间的美观度之和
示例1
输入
6 1 2 2 3 3 1
输出
39
说明
每个区间的不同颜色种类相加答案为39
备注:
对于30%的数据,保证n≤10 对于60%的数据,保证n≤100 对于100%的数据,保证n≤1000 对于所有数据,保证每个珠子的颜色标号小于等于1000
三、理解&思路
本题难点:
1.如何理解区间的定义 :所有n×(n+1)/2 个区间,不同理解方法算法不同,难度也不同!
由于我的理解方式不同,导致做的时候比较复杂,并且运行超时只过了60%,so我的理解方法就不讲了,想要了解的看代码,或者私信我。
下面这种理解思路是学的别人。
举例:
6
1 2 2 3 3 1
6+5+4+3+2+1=(n+1)*n/2=6*7/2=21个区间。
2.如何正确的运用STL库
区间中不同颜色的珠子个数——>STL库中的<set>容器。(默认各位懂得set容器)
set<int>s;//定义数组s
s.insert(a[k]);//将a[k]存入s数组
s.clear();//将s数组清空
四、代码
暴力枚举例题《区间美观度之和》//STL set函数例题(AC代码)
#include<iostream>
#include<set>
using namespace std;
int a[1001];
int sum[1001];
int main()
{
set<int>s;
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
int sum=0;
for(int j=0;j<n;j++)
{
for(int k=j;k<n;k++)
{
s.insert(a[k]);
sum+=s.size();
printf(" %d\n",sum);
}
// printf(" %d",sum);
s.clear();
}
printf("%d\n",sum);
return 0;
}
鄙人只对了60%的代码,有兴趣的朋友可用研究一下区别
#include<iostream>
#include<set>
using namespace std;
int main()
{
int n;
set<int> flag;
int sum=0;
cin>>n;
int num[1001]={0};
for(int i=0;i<n;i++)
{
cin>>num[i];
// cout<<" "<<num[i];
}
// cout<<endl;
for(int i=1;i<=n;i++)
{
for(int j=0;j!=n-i+1;j++)
{
int l=0;
for(int k=j;l!=i;k++,l++)
{
flag.insert(num[k]);
// printf("%d=%d ",j,num[k]);
}
// printf("\n");
sum+=flag.size();
// printf(" flag.size()=%d\n",flag.size());
flag.clear();
// printf(" j=%d\n",j);
}
// printf(" sum=%d\n",sum);
}
cout<<sum<<endl;
return 0;
}