复赛强化练习

完美的数组

题目描述

对于一个n个元素的整数数组,如果这个数组两个连续元素的差的绝对值包括了[1,n-1]之间的所有整数,则这个数组叫做“完美的数组”,如数组1 4 2 3,因为差的绝对值分别为:3,2,1。符合条件,因此是一个“完美数组”。那么如何用计算机实现判断一个数组是不是“完美数组”呢? 

输入描述

第一行是一个整数n(1≤n≤1000),表示整数的个数
第二行是n个空格隔开的在[-10^8,10^8]之间的整数。

输出描述

输出一行,如果是完美的数组,则输出"Jolly",否则输出"Not jolly"。

样例

输入
4
1 4 2 3
输出
Jolly

提示

有n个数,那么两两之间有一个差,所以一定有n-1个差。
这n-1个差的绝对值,包含[1,n-1]之间的所有数。那也就是说,如果排好了序,每个数都应该是连续且唯一,才能占满整个范围(1~n-1)。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int a[10000005];
int b[10000005];
int main(){
	int n;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n-1;i++){
		b[i]=abs(a[i]-a[i+1]);
	}
	sort(b+1,b+n);
	for(int i=1;i<=n-1;i++){
		if(b[i]!=i){
			cout<<"Not jolly";
			return 0;
		}
	}
	cout<<"Jolly";
	return 0;
}

金币

题目描述

乔治在梦中来到了一个神奇部落,这个部落的神树具有奇特的功能:对于 每一位新朋友,都会获赠金币,而且金币的数量会随时间的延续而增加: 第 1 周,每天 1枚金币; 第 2 周,每天 2枚金币; 第 3 周,每天 3枚金币;⋯⋯ 请问:至少多少天,乔治的金币数量达到 n 枚? 

输入描述

一行,只有一个正整数 n。 

输出描述

一行,一个整数,表示金币达到 n 枚所需的最少天数。 

样例

输入
30
输出
17

提示

【样例说明】
第 1 周:每天 1 枚,共 7 枚;
第 2 周:每天 2 枚,共 14 枚; 第 3 周:每天 3 枚,3 天即可: 7+14+3*3=30 。
共计: 7+7+3 = 17 天。
【数据规模】
对于 30%的数据, n 不超过 2147483647 ; 对于 100%的数据, n 的位数不超过 18。

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
long long n; 
long long cnt=1;
long long s,i;
int main(){
	cin>>n;
	while(s<n){
		s+=cnt;
		i++;
		if(i%7==0){
			cnt++;
		}
	}
	cout<<i;
	return 0;
}

鸢尾花数

题目描述

所谓鸢尾花数,是指一个正整数的十进制表示中,任意相邻两位的数字之差是一个常数,比如12345,8642,66666都是鸢尾花数,而88910与121不是鸢尾花数。

给定一个区间[a,b],请找出在a到b之间的所有鸢尾花数。

输入描述

单独一行:两个正整数a与b

输出描述

单独一行:表示给定区间内所有的鸢尾花数,以空格隔开。如果该区间内没有鸢尾花数,输出-1

输入样例

100 150

输出样例

111 123 135 147

数据描述

1≤a,b≤10​5​​

代码

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
int x[100005];
int main(){
	int a,b;
	bool ff=0;
	cin>>a>>b;
	for(int i=a;i<=b;i++){
		int m=i,n=1;
		while(m!=0){
			x[n]=m%10;
			m/=10;
			n++;
		}
		bool f=1;
		int y=x[2]-x[1];
		//cout<<y<<" ";
		for(int j=3;j<=n-1;j++){
			if(x[j]-x[j-1]!=y){
				f=0;
				break;
			}
		}
		if(f==0){
			continue;
		}
		else{
			ff=1;
			cout<<i<<" ";
		}
	} 
	if(ff==0){
	    cout<<"-1";
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值