西南民族大学第十届校赛 题解

做了一个小时有事出去了,所以还没看其他的题目,放寒假的时候再补上吧。

 A :dreamstart的催促

简单快速幂的运用,水题。

链接:https://ac.nowcoder.com/acm/contest/322/A
来源:牛客网
 

题目描述

有一天集训队的学弟们正在计算一堆数,但是dreamstart感觉他们算的太慢了,就让他们坐在一起想出一个快速计算的方法,但是由于他们一时想不出来,想让你帮助他们。他们说现在有一个数列,要算出第 i 个数的 i 次幂并且把每个数计算出来的值加到一起,最后答案模10000019。

聪明的你可以帮助他们吗?

输入描述:

第一行有一个整数n,n <= 1e5

接下来一行有n个数,每个数的大小不超过1e16

输出描述:

输出取模之后的和

示例1

输入

复制

4
1 6 9 12

输出

复制

21502
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
typedef long long LL;
using namespace std;

const long long mod=10000019;
LL power(LL a, LL b, LL c)
{
     int res = 1;
     a %= c;
     while (b)
     {
         if (b & 1)
             res = (res * a) % c;
         a = (a * a) % c;
         b >>= 1;
     }
     return res;
}
LL a[100000+10];
int main()
{
	LL n,m,j,k,i,T;
	scanf("%lld",&n);
	LL ans=0;
	for (i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		ans += power(a[i],i,mod);
		ans%=mod;
	}
	printf("%lld
",ans);
	
	return 0;
 } 

D : >A->B->C-

简单的数组下标运用,如果数据大了,推荐用map写

链接:https://ac.nowcoder.com/acm/contest/322/D
来源:牛客网
 

题目描述


 

一天小A在金色的银杏树下向他喜欢的小姐姐B表白了,“对不起,我喜欢的是C”,B这样说道,小A尴尬的笑了笑转身离开了。他心里默默说着“对不起,C喜欢我。”(233333333)

Love triangle被定义为:如果A喜欢B,B喜欢C,C喜欢A则称为Love triangle。现在让你寻找有没有Love triangle。

输入描述:


 

第一行一个正整数N(n<=5000),第二行n个数X1,X2,X3……Xn代表i喜欢Xi。

输出描述:

如果存在Love triangle则输出YES,没有则输出NO。

示例1

输入

复制

5
2 4 5 1 3

输出

复制

YES
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
typedef long long LL;
using namespace std;

int a[100000+10];

int main()
{
	int n,m,j,k,i,T;
	cin>>n;
	for (i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	bool flag=false;
	int x,y,z;
	for (i=1;i<=n;i++)
	{
		x= i;
		y = a[i];
		z = a[a[i]];
		if (a[a[a[i]]]  == x)
		{
			flag = true;
			//printf("%d %d %d
",x,y,z);
			break;
		}
	}
	if (flag) cout<<"YES"<<endl;
	else
	cout<<"NO"<<endl;
	return 0;
}

F : 集训队脱单大法:这是一道只能由学姐我自己出数据的水题

稍微整理一下就能推出公式了,暴力超时。

链接:https://ac.nowcoder.com/acm/contest/322/F
来源:牛客网
 

题目描述

        总所不周知!ZZZZone有了女朋友却谁也不知道。但是ZZZZone在集训队总是和陈大佬走的很近,每天搂搂抱抱十分不成体统!于是就被ZZZZone的女朋友给知道了,但是呢,ZZZZone的女朋友是一个热爱画画的温柔又可爱的女子,于是她决定把ZZZZone大卸两块,没错是两块!!

       ZZZZone呢他的长度为 n,并且每个单位长度都有一个相对应的重量,他的小女朋友希望将ZZZZone切成两部分后,两个部分中的最大重量之差的绝对值最大(显然两个部分均不能为空啊),她呢觉得很惆怅,不知道该怎么切最好,所以想让你们来想想办法。

输入描述:

第一行为一个n(2 <= n <= 105),表示ZZZZone的长度,第二行为n个数,表示ZZZZone每个单位长度的重量(0 <= a[i] <= 106)。

输出描述:

输出切成两部分后,每部分的重量的最大值之差的绝对值最大是多少。

示例1

输入

复制

4
3 4 1 6

输出

复制

3

备注:

对于样例:

4

3 4 1 6

那么一共有 3 种切法,分别是:

第一部分为 { 3 }, 第二部分为{ 4,1,6 },此时两部分的最大值之差的绝对值为 3

第一部分为 { 3,4 }, 第二部分为{ 1, 6 },此时两部分的最大值之差的绝对值为 2

第一部分为 { 3,4,1 }, 第二部分为{ 6 },此时两部分的最大值之差的绝对值为 2

所以答案为3.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
typedef long long LL;
using namespace std;

int a[100000+10];

int main()
{
	int n,m,j,k,i,T;
	cin>>n;
	int max = -1;
	for (i=0;i<n;i++)
	{
		cin>>a[i];
		if (a[i]>=max)
		max = a[i];	
	}
	if (max!=a[0] && max!=a[n-1])
	{
		if (a[0]<a[n-1])
		cout<<max-a[0]<<endl;
		else
		cout<<max-a[n-1]<<endl;
	}
	else
	{
		if (max==a[0])
		cout<<max-a[n-1]<<endl;
		else if (max==a[n-1])
		cout<<max-a[0]<<endl;
	}
	
	return 0;
}

I :小A的期末作业

我竟然没有在3分钟内写完,唉!手速不行了。

链接:https://ac.nowcoder.com/acm/contest/322/I
来源:牛客网
 

题目描述

期末了, 老师给小A布置了一道期末作业, 让小A设计一个图案, 追求完美的小A想要用编程来完成这个图案:

小A想要设计一个由*符号组成的“大于号”图案, 图案的大小为n, 一共有2n-1行, 每行有n个*符号, 每一行前面有一些空格。

第一行没有空格, 第二行有一个空格, 第三行有两个空格。。。。 依次类推

图案是轴对称图形。

输入描述:

读入一个数字n(1 <= n <= 100), 表示图案的大小.

输出描述:

输出小A想要的图形

示例1

输入

复制

4

输出

复制

****
 ****
  ****
   ****
  ****
 ****
****

示例2

输入

复制

5

输出

复制

*****
 *****
  *****
   *****
    *****
   *****
  *****
 *****
*****
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
typedef long long LL;
using namespace std;

int main() {
	int n,m,j,k,i,T;
	while (cin>>n) {


		int a = n-1;
		///////////////////////
		for (i=0; i<a; i++) {
			for (j=0; j<i; j++)
				printf(" ");
			for (k=1; k<=n; k++)
				printf("*");
			printf("
");
		}
		///////////////////////
		for (i=1; i<n; i++)
			printf(" ");
		for (i=1; i<=n; i++)
			printf("*");
		printf("
");
		/////////////////////////
		for (i=a-1; i>=0; i--) {
			for (j=0; j<i; j++)
				printf(" ");
			for (k=1; k<=n; k++)
				printf("*");
			printf("
");
		}
	}
	return 0;
}

K : 正方体

就是这么几种情况,

中间的一行一定是第一个格子==第三个格子,第二个格子==第四个格子。

然后第一行 要有一个不为0的数字和第三行不为0的数字相等  就行

链接:https://ac.nowcoder.com/acm/contest/322/K
来源:牛客网
 

题目描述

已知一个正方体,每个面上都有任意一个数(假设每一面的面积足够大来装下当前面上的数字),现被展开成了如下形式:

输入中保证第一行有一个面,第二行有四个面,第三行有一个面。请用代码检查这个正方体对立面上的数是否相同。

输入描述:

输入包含多个测试样例。第一行为一个整数T(1 <= T <= 1e4),接下来每个样例占3行,每行都包括4个数,为0表明当前位置不表示面,每个面上的数值范围不超过int。

Eg:上图的输入为:

0 1 0 0

2 4 2 4

0 0 1 0

输出描述:

对于每个测试样例,如果当前正方体的三个对立面的数都分别相同的话就输出”Yes!”,否则输出”No!”。每个结果占一行,注意每50个结果要加一个空行。

示例1

输入

复制

3
0 2 0 0
1 3 1 3
0 2 0 0
0 2 0 0
1 3 1 3
0 0 0 2
0 0 0 2
1 2 2 1
0 0 1 0

输出

复制

Yes!
Yes!
No!
#include<iostream>
using namespace std;

int main()
{
	int n,m,j,k,i,T;
	int a[10],b[10],c[10];
	cin>>T;
	int count=0;
	while (T--)
	{
		count++;
		for (i=0;i<4;i++)
		cin>>a[i];
		for (i=0;i<4;i++)
		cin>>b[i];
		for (i=0;i<4;i++)
		cin>>c[i];
		
		bool flag = false;
		if (b[0]==b[2]&&b[1]==b[3])
		{
			for (i=0;i<4;i++)
			{
				for (j=0;j<4;j++)
				{
					if (a[i]!=0&&c[j]!=0&&a[i]==c[j])
					{
						flag = true;
						break;
					}
				}
			}
		}
		if (flag)
		cout<<"Yes!"<<endl;
		else
		cout<<"No!"<<endl;
		if (count%50==0)
		cout<<endl;
	}
	
	return 0;
}

L : 简单的分数 

water

链接:https://ac.nowcoder.com/acm/contest/322/L
来源:牛客网
 

题目描述

John最近对分数很感兴趣,在研究分数的加减运算。现在要求计算两个分数的运算。

输入描述:

输入一个正整数T,表示有T组数据

每组数据包括5个整数op,a,b,c,d

op为1表示a/b + c/d;op为0表示为a/b – c/d

其中1 <= T, a,b,c,d <= 100;

输出描述:

输出分数运算结果“x/y”,要求x/y是最简分数。

示例1

输入

复制

4
1 1 2 1 3
0 1 2 1 2
1 1 2 1 2
0 1 3 1 2

输出

复制

5/6
0/1
1/1
-1/6

备注:

如果有运算符,应在x前面,如“-1/6”,而不是“1/-6”。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath>
#include<queue>
#include<map>
#include<stack>
typedef long long LL;
using namespace std;

int gcd(int a,int b)
{
	return a%b==0?b:gcd(b,a%b);
}

int main()
{
	int n,m,j,k,i,T,a,b,c,d,op;
	int e,f;
	cin>>T;
	while (T--)
	{
		bool fu = false;
		cin>>op>>a>>b>>c>>d;
		if (op==1)
		{
			f = b*d;
			e = a*d+b*c;
			
		}
		else if (op==0)
		{
			f = b*d;
			e = a*d-b*c;
		}
		int x = gcd(e,f);
		e/=x;
		f/=x;
		
		if (  (e<0)&&(f>0) || (e>0&&f<0))
		{
			fu = true;
			e = abs(e);
			f = abs(f);
		}
		if (e<0 && f<0)
		{
			e = abs(e);
			f = abs(f);
		}
		
		if (fu)
		cout<<"-"<<e<<"/"<<f<<endl;
		else
		cout<<e<<"/"<<f<<endl;
	}
	
	return 0;
}






M :  Hj 浇花

很巧妙的方法,暴力不可取。

如果在【a,b】间浇水,则开一个数组记录发 f [a]++ , f [b+1]--;

那么前 f 的和就是 f 被浇水的次数,用到了前缀数组和的思想。

链接:https://ac.nowcoder.com/acm/contest/322/M
来源:牛客网
 

题目描述

HJ养了很多花(99999999999999999999999999999999999盆),并且喜欢把它们排成一排,编号0~99999999999999999999999999999999998,每天HJ都会给他的花浇水,但是他很奇怪,他会浇n(1 <= n <= 2 * 105)次水,每次都会选择一个区间[l, r],(0 <= l <= r <= 106),表示对区间[l, r]的花都浇一次水。现在问你,通过这些操作之后,被浇了i(1 <= i <= n)次水的花的盆数。

输入描述:

输入:第一行一个n,表示HJ的操作次数,接下来的n行,表示每一次选择的浇水区间。

输出描述:

输出:输出n个数字Cnt1, Cnt2……Cntn,(用空格隔开)Cnti表示被浇了i次水的花的盆数。

示例1

输入

复制

3
0 3
1 3
3 8

输出

复制

6 2 1

示例2

输入

复制

3
1 3
2 4
5 7

输出

复制

5 2 0

说明


 

对于样例1的图形解释

被浇了1次的有:0, 4, 5, 6, 7, 8, cnt1 = 6

被浇了2次的有:1, 2.           cnt2 = 2

被浇了3次的有: 3 .            cnt3 = 3

#include<iostream>
using namespace std;

int a[1000000+10],b[1000000+10];

int main()
{
	int n,m,j,k,i,T,x,y;
	cin>>n;
	int min=0x3fffffff,max=-1;
	for (i=0;i<n;i++)
	{
		cin>>x>>y;
		if (x<min) min = x;
		if (y>max) max = y;
		a[x]++;
		a[y+1]--;
	}
	for (i=min;i<=max;i++)
	{
		a[i] += a[i-1];
		b[a[i]]++;
	}
	
	for (i=1;i<=n;i++)
	{
		cout<<b[i]<<" ";
	}
	cout<<endl;
	
	return 0;
}


原文地址:https://www.cnblogs.com/Romantic-Chopin/p/12451252.html