十一届蓝桥杯校内选拔赛B组

以下都只是个人看法,并不是正确答案,有些代码,答案有错误,主要分享下题目,记录下。

1.问题描述
  不超过19000的正整数中,与19000互质的数的个数是多少?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
  
  思路:直接遍历循环下,如果19000与其最大公约数是1,那么就是互质
个人答案:

7200

2.问题描述
  在计算机存储中,15.125GB是多少MB?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
 
  没什么好说的

15488

3.问题描述
  将LANQIAO中的字母重新排列,可以得到不同的单词,如LANQIAO、AAILNOQ等,注意这7个字母都要被用上,单词不一定有具体的英文意义。
  请问,总共能排列如多少个不同的单词。
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

思路:有重复问题的全排列,很经典的问题,我用的递归写的
个人答案:

2520

4.问题描述
  一个包含有2019个结点的无向连通图,最少包含多少条边?
答案提交
  这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分
 
 简单的数据结构知识

2018

5.问题描述
  在数列 a_1, a_2, …, a_n中,如果 a_i 和 a_j 满足 i < j 且 a_i > a_j,则称为一个逆序数对。
  给定一个数列,请问数列中总共有多少个逆序数对。
输入格式
  输入的第一行包含一个整数 n。
  第二行包含 n 个整数 a_1, a_2, …, a_n,相邻的整数间用空格分隔,表示给定的数列。
输出格式
  输出一行包含一个整数,表示答案。
样例输入

6
3 1 5 2 3 5

样例输出

4

评测用例规模与约定
  对于 50% 的评测用例,1 <= n <= 100,0 <= 数列中的数 <= 1000。
  对于所有评测用例,1 <= n <= 1000,0 <= 数列中的数 <= 10000。
  
  思路:因为数据规模不大,就直接用的暴力,直接双重循环
  代码:

#include<bits/stdc++.h>
using namespace std;
int a[1010];
int main()
{
  int n;
  long long ans=0;
  cin>>n;
  for(int i=0;i<n;i++)
  	cin>>a[i];
   for(int i=0;i<n;i++)
   {
   	for(int j=i+1;j<n;j++)
   	{
   		if(a[i]>a[j])
   		   ans++;
	   }
   }
  cout<<ans<<endl;
  return 0;
}

6.问题描述
  输入一个单词,请输出这个单词中第一个出现的元音字母。
  元音字母包括 a, e, i, o, u,共五个。
输入格式
  输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式
  输出一行包含一个字母,为单词中第一个出现的元素字母。若单词中不存在元音字母,输出字母n。
样例输入

hello

样例输出

e

样例输入

fly

样例输出

n

评测用例规模与约定
  对于所有评测用例,单词中的字母个数不超过100。
 思路:直接用了标记数组,先把五个元音字母标记为true,然后遍历字符串,如果当前字母是被标记为true的,那么就输出
 
代码:

#include<bits/stdc++.h>
using namespace std;
char s[]="aeiou";
bool f[128];
int main()
{
	string t;
	cin>>t;
	for(int i=0;i<5;i++)
	f[s[i]]=true;
	for(int i=0;i<t.size();i++)
	{
		if(f[t[i]])
		{
			cout<<t[i];
			return 0;
		}
	}
	cout<<"n";
    return 0;
}

7.问题描述
  给定一个单词,请使用凯撒密码将这个单词加密。
  凯撒密码是一种替换加密的技术,单词中的所有字母都在字母表上向后偏移3位后被替换成密文。即a变为d,b变为e,…,w变为z,x变为a,y变为b,z变为c。
  例如,lanqiao会变成odqtldr。
输入格式
  输入一行,包含一个单词,单词中只包含小写英文字母。
输出格式
  输出一行,表示加密后的密文。
样例输入

lanqiao

样例输出

odqtldr

评测用例规模与约定
  对于所有评测用例,单词中的字母个数不超过100。

比较简单,注意下要取余
代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
  string s;
  cin>>s;
  for(int i=0;i<s.size();i++)
  {
  	s[i]='a'+(s[i]-'a'+3)%26;
  }
   cout<<s<<endl;
  return 0;
}

8.问题描述
  对于一个 n 行 m 列的表格,我们可以使用螺旋的方式给表格依次填上正整数,我们称填好的表格为一个螺旋矩阵。
  例如,一个 4 行 5 列的螺旋矩阵如下:
  1 2 3 4 5
  14 15 16 17 6
  13 20 19 18 7
  12 11 10 9 8
输入格式
  输入的第一行包含两个整数 n, m,分别表示螺旋矩阵的行数和列数。
  第二行包含两个整数 r, c,表示要求的行号和列号。
输出格式
  输出一个整数,表示螺旋矩阵中第 r 行第 c 列的元素的值。
样例输入

4 5
2 2

样例输出

15

评测用例规模与约定
  对于 30% 的评测用例,2 <= n, m <= 20。
  对于 70% 的评测用例,2 <= n, m <= 100。
  对于所有评测用例,2 <= n, m <= 1000,1 <= r <= n,1 <= c <= m。
代码:

#include<bits/stdc++.h>
using namespace std;
int s[1010][1010];
int main()
{
    int n,m,x,y;
    cin>>n>>m>>x>>y;
    int a=m,b=n-1,c=m-1,d=n-2,t=1;
	int k=1,p=1,k2=n,k3=m;
    while(t<=n*m)
    {
      for(int i=1;i<=a;i++)
      {  
    	s[k][p++]=t++;
	  }
	  if(t>=n*m)
	  break;
	  k++, p--;
	  for(int j=1;j<=b;j++)
	   s[k++][p]=t++;
	  if(t>=n*m)
	   break;
	   p--,k--;
	  for(int i=1;i<=c;i++)
	  s[k][p--]=t++;
	  if(t>=n*m)
	  break;
	  k--,p++;
	  for(int j=1;j<=d;j++)
	  s[k--][p]=t++;
	  if(t>=n*m)
	  break;
	  p++,k++;
	  a-=2,b-=2;
	  c-=2,d-=2;
	}
    cout<<s[x][y];
    return 0;
}

9.问题描述
  给定一个序列 a_1, a_2, …, a_n。其中 a_1 是最大的数,没有其他数与 a_1 相等。
  对于从第二个数开始的每个数 a_i,请找到位置在 a_i 之前且比 a_i 大的,位置上距离 a_i 最近的数 a_j。称 i-j 为 a_i 的前向距离。
  对于给定的序列,请求出所有数的前向距离之和。
输入格式
  输入的第一行包含一个整数 n,表示序列的长度。
  第二行包含 n 个正整数,为给定的序列。
输出格式
  输出一个整数,表示序列中所有数的前向距离之和。
样例输入

8
9 1 3 5 2 7 6 3

样例输出

14

样例说明
  序列中从第二项开始的前向距离依次为:
  1, 2, 3, 1, 5, 1, 1
  和为14。
数据规模和约定
  对于70%的评测用例,1 <= n <= 1000;
  对于所有评测用例,1 <= n <= 100000,a_1 <= 1000000。
  请注意答案可能很大,可能需要使用 long long 来保存。
  
  还给了提示,非常的善良
  b[i]表示在第i个数之前的且比a[i]大的,距离当前数最近的编号
 思路:直接暴力找会超时,数据范围比较大,所以我们要跳着找,每次和前面的数(t)比较,如果小于当前数,那就和b[t]比较,一直找到为止
代码:

#include<bits/stdc++.h>
using namespace std;
int a[100100],b[100100];
long long ans=1;
int main()
{
  int n;
  cin>>n;
  for(int i=0;i<n;i++)
  cin>>a[i];
  b[1]=1;
  for(int i=2;i<n;i++)
  {
  	for(int j=i-1;j>=0;j--)
  	{
  		if(a[j]>a[i])
  		{
  			b[i]=j;
  			break;
		}
		else
		 j=b[j]; 
	  }
	  ans+=i-b[i];
  }
  cout<<ans<<endl;
  return 0;
}

10、问题描述
  给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。
  三个水杯都没有标刻度线,在水杯之间可以相互倒水。当从一个杯子向另一个杯子倒水时,只能将一个杯子的水倒空或者将另一个杯子的水倒满。不允许倒到三个杯子以外的地方。
  给定一个目标状态,请写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入格式
  输入的第一行包含一个整数 n,表示总共有 n 组测试数据。
  接下来每组测试数据包含两行,第一行包含三个整数 V_1,V_2,V_3,分别表示三个水杯的体积。
  每组数据的第二行包含三个整数E_1,E_2,E_3(体积小于等于相应水杯体积)表示最终状态。
输出格式
  输出 n 行,每行对应一组数据的结果。
  如果可以达到最终状态,输出最少的倒水次数,如果不能达到目标准备,输出-1。
样例输入

2
6 3 1
4 1 1
9 3 2
7 1 1

样例输出

3
-1

评测用例规模与约定
  对于所有评测用例,0<n<=50,0<V_3<V_2<V_1<=100,0<=E_1<=V_1,0<=E_2<=V_2,0<=E_3<=V_3,E_1+E_2+E_3=V_1。

不会写,如果你会的话帮帮我,嘻嘻

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值