数颜色(牛客NC210755详解)

一、链接

数颜色(牛客NC210755)

链接:登录—专业IT笔试面试备考平台_牛客网

二、题目

题目描述

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;
}

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值