Magical Array

文章讲述了Valery对魔法的热爱如何引领他发现了一个神奇的数学现象:如果一个数组的最小值和最大值相等,则认为它是魔法数组。文章要求计算给定数组中这样的魔法子数组数量,通过C++代码展示了如何解决这个问题。
摘要由CSDN通过智能技术生成

题目描述

Valery is very interested in magic. Magic attracts him so much that he sees it everywhere. He explains any strange and weird phenomenon through intervention of supernatural forces. But who would have thought that even in a regular array of numbers Valera manages to see something beautiful and magical.

Valera absolutely accidentally got a piece of ancient parchment on which an array of numbers was written. He immediately thought that the numbers in this array were not random. As a result of extensive research Valera worked out a wonderful property that a magical array should have: an array is defined as magic if its minimum and maximum coincide.

He decided to share this outstanding discovery with you, but he asks you for help in return. Despite the tremendous intelligence and wit, Valera counts very badly and so you will have to complete his work. All you have to do is count the number of magical subarrays of the original array of numbers, written on the parchment. Subarray is defined as non-empty sequence of consecutive elements.

输入格式

The first line of the input data contains an integer n.The second line contains an array of original integers a1,a2,...,an​.

输出格式

Print on the single line the answer to the problem: the amount of subarrays, which are magical.

Please do not use the %lld specificator to read or write 64-bit numbers in C++. It is recommended to use cin, cout streams (you can also use the %I64d specificator).

题面翻译

如果一个数组的最小值和最大值相同,则称这个数组是Magical的。定义一个数组的子数组为一个数组中的连续的数组成的序列。给你一个数组,求这个数组中Magical的子数组有多少个。

样例 #1

样例输入 #1

4
2 1 1 4

样例输出 #1

8

样例 #2

样例输入 #2

5
-2 -2 -2 0 1

样例输出 #2

8

这道题是一道思维题 ,下面给大家代码,大家可以自己想思路,在评论区评论!可以借助代码理解

代码如下:

#include<bits/stdc++.h>
using namespace std;
int a[10000005];
int main(){
	int n;
	long long cnt=0,cntt=1;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=2;i<=n;i++){
		if(a[i]==a[i-1]){
			cntt++;
		}
		else{
			cnt+=(1+cntt)*cntt/2;
			cntt=1;
		}
	}
	cnt+=(1+cntt)*cntt/2;
	cout<<cnt;
	return 0; 
} 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值