zoukankan      html  css  js  c++  java
  • 西南民族大学第十届校赛 题解

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

     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;
    }
    
    
    
  • 相关阅读:
    Rsync实现文件同步的算法(转载)
    Python模拟登录cnblogs
    负载均衡中四层和七层的介绍(转帖)
    Lvs+Keepalived实现MySQL高可用
    MySQL配置主主及主从备份
    Vim扩展YouCompleteMe插件
    使用Git
    Django回忆录
    Ansible安装配置及使用
    Hive学习之四 《Hive分区表场景案例应用案例,企业日志加载》 详解
  • 原文地址:https://www.cnblogs.com/Romantic-Chopin/p/12451252.html
Copyright © 2011-2022 走看看