其他分享
首页 > 其他分享> > upc第十一场2020.11.30

upc第十一场2020.11.30

作者:互联网

问题 A: 约数

时间限制: 1 Sec 内存限制: 512 MB

题目描述
对于一个正整数n,如果n除以某个正整数d所得的余数为0,我们称d是n的约数。显然1和n一定是n的约数,请问对于给定的n(n≥2),除了n本身以外,最大的约数是多少?
输入
共一行,包含一个正整数n。
输出
共一行,包含一个正整数,表示n除了自身以外的最大约数。
样例输入 Copy
15
样例输出 Copy
5
提示
15的约数有1,3,5,15,除了15本身以外的最大约数为5。

对于30%的数据,n≤100;
对于50%的数据,n≤106;
对于100%的数据,2≤n≤2×109 。
思路:求最小的约数,然后与原数相除即为最大约数

#include<bits/stdc++.h>
using namespace std;
long long n,i,r;
int main()
{
	scanf("%lld",&n);
	for(i=2;i<n;i++)
	{
		if(i!=n&&n%i==0)
		{
			r=i;
			break;
		}
	}
 	printf("%d",n/r);
	return 0;
}

问题 B: HD阶乘

时间限制: 1 Sec 内存限制: 128 MB

题目描述
n的阶乘定义为n! = n ∗ (n − 1) ∗ (n − 2) ∗ … ∗ 1。
n的双阶乘定义为n!! = n ∗ (n − 2) ∗ (n − 4) ∗ … ∗ 2或n!! = n∗ (n − 2) ∗ (n − 4) ∗ … ∗ 1,取决于n的奇偶性。
但是阶乘的增长速度太快了,所以我们现在只想知道n!和n!!末尾的0的个数。
输入
一个正整数n, n ≤ 107
输出
两个整数, 分别为n!和n!!末尾0的个数。
样例输入 Copy
10
样例输出 Copy
2 1
提示
10! = 3628800, 10!! = 10 ∗ 8 ∗ 6 ∗ 4 ∗ 2 = 3840

这题现在我也不是很理解,不过就是:
阶乘尾部出现的零就是5和偶数相乘的结果,在n阶乘中,偶数的个数要比5个数多得多,所以尾部零的个数就为多少个5相乘的个数(10看做2x5即一个5,25看做两个5…)。
在求n!!的时候,如果n为奇数,则都是奇数相乘,而奇数相乘的结果必然为奇数,奇数的末尾不可能有0,所以这种情况下输出0即可。如果n为偶数,则都是偶数相乘,那结果必然为偶数,末尾就可能有0,需要进行计算判断。其中双阶乘的末尾的0的出现通过两种方式,第一种当n<50时,主要是通过10的倍数,第二种当n>=50时,这个时候数字当中出现5,有10的倍数的原因,也有5*偶数的原因。

#include<bits/stdc++.h>
using namespace std;
int main()
{
	long long n,ans1=0,ans2=0,t1,t2,p,x1,x2;
	scanf("%lld",&n);
	t1=n;
	t2=n;
	x1=5;x2=10;p=5;
	while(t1/x1)//直到/5的倍数为0时停 
	{
		ans1+=t1/x1;//累加出现5的个数 
		x1*=p;     //每次*5 
	}
	if(n%2==0)
	{	while(t2/x2)//直到/10的倍数为0时停 
		{
		ans2+=t2/x2;// 累加出现10的个数 
		x2*=p;//每次*5
		}
	}
	else
		ans2=0;//当n为奇数时那绝对不会出现0 
	printf("%lld %lld",ans1,ans2);
	return 0;
 } 

问题 C: HD序列

时间限制: 1 Sec 内存限制: 128 MB

题目描述
小Z手上有一个长度为n的整数序列a1, a2,…,an,但是他不太喜欢这个序列,因此他想通过一些操作将序列a变成自己想要的序列b。初始时序列b是空的,接下来小Z将依次进行n次操作,其中第i次操作分为以下两步:

  1. 将ai加到序列b的尾部;
  2. 翻转序列b(即b1,b2,…,bi变成bi,bi-1,…,b1 )。
    小Z想知道n次操作之后序列b会是什么样的,你能帮助他吗?
    输入
    第一行包含一个正整数n;
    第二行包含n个正整数,第i个正整数表示ai。
    输出
    共一行,包含n个数,表示n次操作后的序列b。
    样例输入 Copy
    4
    1 2 3 4
    样例输出 Copy
    4 2 1 3
    提示
    每次操作后序列b如下:
    ●1
    ●2,1
    ●3,1,2
    ●4,2,1,3
    【数据范围】
    对于20%的数据,n≤100;
    对于50%的数据,n≤1000;
    对于100%的数据,1≤n≤2×105,0≤ai≤109。
    写几个数列找规律即可,首先对n进行奇偶分类
#include<bits/stdc++.h>
using namespace std;	
long long n,a[200001];
int main()
{	long long i;
	scanf("%lld",&n);
	for(i=1;i<=n;i++)
		scanf("%lld",&a[i]); 
	if(n%2==0)
	{
		for(i=n;i>=2;i=i-2)
			printf("%lld ",a[i]);
		for(i=1;i<=n-1;i+=2)
			printf("%lld ",a[i]);
	}
	else 
	{
		for(i=n;i>=1;i-=2)
			printf("%lld ",a[i]);
		for(i=2;i<=n-1;i+=2)
			printf("%lld ",a[i]);
	}
	return 0;
}

问题 D: HD糖果

时间限制: 1 Sec 内存限制: 128 MB

题目描述
小民是一个很喜欢吃糖果的小孩子,他给所有的糖果进行了分类,有A~Z一 共26种糖果,现在小民有一排糖果,小民很奇怪,吃糖果只喜欢吃连续的若干个 ,并且不希望吃到相同分类的糖果。现在小民让你帮他计算一下L的最大值,使得他的一排糖果中的***任意连续L个糖果都不会有相同的分类。***
输入
输入仅一行,一行由大写字母组成的字符串,代表小民的一排糖果。
输出
输出仅一行,输出L的最大值。如果一排糖果都没有相同的,请输出−1。
样例输入 Copy
ABABABABABAB
样例输出 Copy
2
提示
令字符串的长度为N
对于20%的数据:1≤N≤100;
对于50%的数据:1≤N≤1000;
对于70%的数据:1≤N≤10000;
对于100%的数据:1≤N≤10000000。

#include<bits/stdc++.h>
using namespace std;
long long  ans,v[10000001],len;
char s[10000001],flag=1;
int main()
{
	
	scanf("%s",s+1);
	len=strlen(s+1);
	for(int i=1;i<=len;i++)
	{
		int u=s[i]-'A'+1;
		
		if(v[u])
			{	ans=min(ans,i-v[u]);
				flag=0;
			}
			
		if(flag==1) ans++;
		v[u]=i;
	}
	if(ans==len) printf("-1\n");
	else printf("%lld\n",ans);
	return 0;
}

问题 G: 数一数

时间限制: 1 Sec 内存限制: 128 MB

题目描述
星期天早上,小明开始做数学家庭作业。因为小明成绩很优异,觉得题目太简单了,思考出道难点的数学题去学校考考同学,他注意到:数学书的第10页和第11页在同一张纸上,但第11页和第12页不在同一张纸上。
哈哈,题目有了,请问数学书的第x页到第y页共有多少张纸呢?
例如:该书的第81页到第92页,共有7张纸。

输入
一行两个数x、y如题所述,用空格隔开。
输出
一个数,表示纸张数。
样例输入 Copy
81 92
样例输出 Copy
7
提示
50%:0<y-x<=15;
100%:1<=x,y<=longint;0<y-x<longint。

问题 H: 博物馆

时间限制: 1 Sec 内存限制: 128 MB

题目描述
从前,有一个偌大的博物馆,每天都会有数以万计的人们来参观,欣赏这里的艺术作品。这一天,博物馆来了N批人,第i批人有Ai个人以及一个导游组成,他们依次到达,但同时也有一些批次的人离开,由于人次太多,博物馆的管理人员递给你一些人数表,就请你来统计一下剩下多少人。

输入
第一行是个整数N,接下来N行。每行两个数,第一个数X,如果X=0则后面接一个数Ai,表示来了Ai个人;如果X=1,那么接下来就有一个数Y,表示来的人中的第Y批离开了。
输出
一个数,表示剩下多少人。
样例输入 Copy
6
0 5
0 6
1 1
0 7
0 8
1 3
样例输出 Copy
16
提示
有四批人,每批人要加上一位导游,分别是6,7,8,9人,离开的是第1和3批,即走了6+8=14人,剩7+9=16人。

对于30%的数据,1≤N≤100,1≤Ai≤1000;
对于100%的数据,1≤N≤1000000,1≤Ai≤1000000。
保证:X只为0或1,Y一定符合要求。

问题 I: 旅游III
时间限制: 1 Sec 内存限制: 128 MB

题目描述
Lanlan的好朋友Qiqi来到了东莞,她决定带Qiqi去东莞的名胜景区旅游,以此增进友谊。但Qiqi不喜欢去拥挤度大于k的景点,而且旅游的时间不能是断开的。Lanlan现在知道了明天n个连续时间景区的拥挤度,她想知道她最多能陪Qiqi旅游多久。

输入
第一行两个整数n,k。
第二行有n个整数表示每个时间的拥挤程度(数值小于1000)。
输出
一个整数表示Lanlan最多能陪Qiqi的时间。
样例输入 Copy
20 2
1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
样例输出 Copy
16
提示
60%的数据 N<=1000
100%的数据 N<=100000

标签:约数,输出,10,30,样例,upc,long,2020.11,Copy
来源: https://blog.csdn.net/qq_51235689/article/details/110410769