蓝桥杯冲刺

例题1:握手问题

在这里插入图片描述

方法1:数学推理(简单粗暴)

在这里插入图片描述

方法2:用代码实现方法1

#include<iostream>
using namespace std;
int main()
{
	int result = 0;
	for (int i = 1; i <= 49; i++)
	{
		for (int j = i + 1; j <= 50; j++)
		{
			//第i个人与第j个人之间的握手总次数(不考虑这7个人之间互不握手)
			result++;
		}
	}
	//这7个人之间握手的次数是21次
	 cout << result - 21;
	return 0;
}

方法3:直接计算握手的总次数

#include<iostream>
using namespace std;
int main()
{
	int arr[51] = { 0 };
	for (int i = 1; i <= 7; i++)
		arr[i] = 1;//假设前7个人之间互不握手,在数组中用1做标记
	int result = 0;
	for (int i = 1; i <= 49; i++)
	{
		for (int j = i + 1; j <= 50; j++)
		{
			//第i个人与第j个人握手
			if (!(arr[i] == 1 && arr[j] == 1))
				result++;
		}
	}
	cout << result;
	return 0;
}

例题2:好数(两种方法)

在这里插入图片描述

方法1:从最低位开始,逐位判断每一位是否满足好数的条件

#include <iostream>
using namespace std;
bool hN(int x)
{
    int t = 1;//此时t表示最低位 
    while (x != 0)
    {
        if (t % 2 == 1)//若奇数位上的数是偶数,则该数不是好数 
        {
            if ((x % 10) % 2 == 0)
                return false;
        }
        else//若偶数位上的数是奇数,则该数不是好数 
        {
            if ((x % 10) % 2 == 1)
                return false;
        }
        x /= 10;
        t++;
    }
    return true;
}

int main()
{
    int N = 0;
    cin >> N;
    int sum = 0;
    for (int i = 1; i <= N; i++)
    {
        if (hN(i) == true)
            sum++;
    }
    cout << sum;
    return 0;
}

方法2:分别得到奇数位与偶数位,然后判断是否满足好数的条件

#include <iostream>
using namespace std;
bool hNum(int x)
{
    int temp=x/10;
    while(x)//判断奇数位上的数是否是偶数
    {
       if((x%10)%2==0)
         return false;
        x/=100;
    }
    while(temp)//判断偶数位上的数是否是奇数
    {
      if((temp%10)%2==1)
         return false;
        temp/=100;
    }
    return true;
}

int main()
{
  int N=0,count=0;
  cin>>N;
  for(int i=1;i<=N;i++)
  {
    if(hNum(i))
     count++;
  }
  cout<<count;
  return 0;
}

例题3:牛数问题(一种正确解法和一种看起来正确的解法)

第一年的时候,有一头母牛,它从第二年开始,每年年初生一头小母牛,每头小母牛从第4个年头开始,也生一头小母牛,请问第n年的时候,有多少头牛?(n>0&&n<55)

方法1(看起来正确):数学推理法

在这里插入图片描述
n>3时的公式是根据n=4~7的数据推导的,也就是说当n<=7时满足公式,其余情况下就不满足了,例如当n=8时,公式得出的结果是18,但正确结果是19(我只能说太坑了)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>
unsigned int sum(unsigned int n)
{
	if (n <= 3)
		return n;
	else
		return (pow(n, 2) - 5 * n) / 2 + 6;
}

int main()
{
	unsigned int n = 0;
	printf("请输入年份\n");
	scanf("%u", &n);
	unsigned int count = sum(n);
	printf("第%u年有%u头牛", n, count);
	return 0;
}

方法2(正确解法)

#include<iostream> 
using namespace std;
/*
经分析可知,一共有四种牛,分别用a、b1、b2、b3表示这四种牛的数量 
a:母牛的数量
b1:1岁的小母牛的数量
b2:2岁的小母牛的数量
b3:3岁的小母牛的数量
*/

int main()
{
	int num[55];//num[1]~num[54]存储第1~54年牛的数量 
	int a=1,b1=0,b2=0,b3=0;//第一年四种牛的数目 
	num[1]=1;
	for(int i=2;i<55;i++) 
	{
		a = a + b3;//第i年的母牛数 = 第i-1年的(母牛数 + 3岁的小母牛数 )
		//for循环用于求第i年的牛数
		num[i] = num[i-1] + a; //第i年的牛数 = 第i-1年的牛数 + 第i年年初母牛生的小母牛的数量
		b3 = b2;//第i年的3岁小母牛数 =  第i-1年的2岁小母牛数
		b2 = b1;//第i年的2岁小母牛数 =  第i-1年的1岁小母牛数/	
		b1 = a; //第i年的1岁小母牛数 =  第i年的母牛数 
	}
      int n;
      cout<<"请输入年份\n" ;
      cin>>n;
	  cout<<num[n];
	return 0;
}

例题3:蛇形上三角

在这里插入图片描述

思路

创建一个100行100列的数组,存储100行的蛇形上三角,再根据输入n的值,打印对应的蛇形上三角

#include<iostream>
using namespace std;
int main()
{
	int arr[100][100]={1};
	/*
5行的蛇形上三角 
	 0 1 2  3  4 
0	 1 3 6 10 15
1    2 5 9 14
2    4 8 13
3    7 12
4    11
	*/
	int temp=1;
	for(int i=1;i<100;i++)
    {
     	 arr[i][0]=arr[i-1][0]+temp;
     	 temp++;
	}
	temp=2;
    for(int i=0;i<100;i++)
	{
	  int m=temp;
	  for(int j=1;j<100;j++)
	  {
	  	arr[i][j]=arr[i][j-1]+temp;
	  	temp++;
	  }	
	  temp=m+1;
    }
	int n;
	cin>>n;
	//如何根据根据输入n的值,打印对应的蛇形上三角 
	for(int i=0;i<n;i++)
	 {
	 	for(int j=0;j<n-i;j++)
	 	{
	 		/*
	 		第1行(i=0)打印n个元素,j从0到n-1,即j<n
	 		第2行(i=1)打印n-1个元素,j从0到n-2,即j<n-1
	 		第3行(i=2)打印n-2个元素,j从0到n-3,即j<n-2
	 		......
	 		第n行(i=n-1)打印1个元素,j=0,即j<1 
	 		因此j<n-i 
	 		*/
	 		
	 		cout<<arr[i][j]<<" ";
		}
		cout<<endl;
	 }
	return 0;
}

再提供一种输出蛇形上三角的方法

	int n;
	cin>>n;
	//如何根据根据输入n的值,打印对应的蛇形上三角 
	int a=n; 
	for(int i=0;i<n;i++)
	 {
	 	for(int j=0;j<a;j++)
	 	{
	 		cout<<arr[i][j]<<" ";
		}
		cout<<endl;
		a--;
	 }

例题4:去除整型数组中的重复元素,将剩下元素排为升序

思路

先将该数组元素排为升序,然后再去掉重复元素

#include<iostream>
using namespace std;
#include<algorithm>
int main()
{
	int n;
	cin>>n;
	getchar();//读取换行符 
	int arr[n];//变长数组,数组的大小可以用变量来指定
	for(int i=0;i<n;i++)
	    cin>>arr[i]; 
	   	getchar();//读取换行符 
	   
	//例用sort函数,使用前要包含头文件<algorithm>,将数组中的元素排为升序
	sort(arr,arr+n);//arr是数组中首元素的地址,arr+n是数组中最后一个元素的下一个元素的地址 
	int arr2[n];
	int pos=0;
	for(int i=0;i<n;i++)
	{
		if(arr[i]!=arr[i+1])
		{
			arr2[pos]=arr[i];
			pos++;
		}
	}
	//打印arr2数组中的元素个数 
	cout<<pos<<endl;
	for(int i=0;i<pos;i++)
       cout<<arr2[i]<<" ";
	return 0;
} 

例题5:纪念品分组

在这里插入图片描述

思路

先将这n件纪念品按升序排列,然后尝试将价格最高的纪念品与价格最低的纪念品分到一组,如果分组不成功,则将价格最高的纪念品单独分到一组,再尝试将价格最低的纪念品与价格第二高的纪念品分到一组。
在这里插入图片描述

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int MaxPrice, n;
	cin >> MaxPrice >> n;
	int arr[n];
	for (int i = 0; i < n; i++)
		cin >> arr[i];
	//将这n件纪念品按照价格排为升序
	sort(arr, arr + n);
	int start = 0, end = n - 1, count = 0;//count表示最少的分组数目  
	while (start <= end)
	{
		//若start与end指向同一件纪念品时,就将这件纪念品单独分为一组,分组结束 
		if (start == end)
		{
			count++;
			break;
		}
		else if (arr[start] + arr[end] > MaxPrice)
		{
			//最贵的纪念品单独分为一组
			count++;
			end--;
		}
		else
		{
			//将最贵的纪念品与最便宜的纪念品分为一组
			start++;
			end--;
			count++;
		}
	}
	cout << count;
}

例题6.与字符串相关的知识(包括反转字符串)

#include<iostream>
using namespace std;
#include<string>
#include<algorithm>
//cin读取字符串时,遇到空格就会停下,因此它无法读取包含空格的字符串 
//
//getline函数可以读取一整行内容,无论这行内容是否包含空格都可以读取 
//int main() 
//{
//	string a;
//	getline(cin,a);//getline读取一整行内容然后存到字符串a中 
//	//翻转函数reverse,使用前包含头文件algorithm 
//	reverse(a.begin(),a.end());//将第一个字符到'\0'之前的字符进行反转 
//	cout<<a; 
//	return 0;
//}



//逆序输出数组中的元素 
//int main()
//{
//	int arr[5]={1,2,3,4,5};
//	reverse(arr,arr+5);//arr是第一个元素的地址,arr+5是最后一个元素的地址的后一个地址 
//	for(int i=0;i<5;i++)
//	  cout<<arr[i]<<" ";
//	return 0;
//} 

//int main()
//{
//	string s; 
//  cin>>s;
//	for(int i=0;i<s.size();i++)
//	{
//		cout<<s[i];
//	}
//	return 0;
// } 

例题7:Excel 计算

在这里插入图片描述

#include<iostream>
using namespace std;
#include<string>
int main() 
{
	int n,m;
	cin>>n>>m;
	int arr[n][m];
	for(int i=0; i<n; i++) {
		for(int j=0; j<m; j++) {
			cin>>arr[i][j];
		}
	}
	string t;
	cin>>t;
	int sum=0;
	for(int i=2,j=1; i<t.size(); i+=3,j+=3) {
		sum+=arr[t[i]-'1'][t[j]-'A'];
	}
	cout<<sum;
	return 0;
}

例题8:不等三元组

在这里插入图片描述
暴力解法,时间复杂度为O(n^3),只能拿部分的分

#include<iostream>
using namespace std;
int main() {
	int n;
	cin>>n;
	int arr[n];
	for(int i=0; i<n; i++)
		cin>>arr[i];

	int count=0;
	for(int i=0;i<n;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			for(int k=j+1;k<n;k++)
			{
				if((arr[i]!=arr[j])&&(arr[j]!=arr[k])&&(arr[i]!=arr[k]))
				//这里不能写成if((arr[i]!=arr[j])&&(arr[j]!=arr[k]))
				count++;
			}
		}
	}
//对三层for循环进行优化
//	for(int i=0;i<n-2;i++)
//	{
//		for(int j=i+1;j<n-1;j++)
//		{
//			for(int k=j+1;k<n;k++)
//			{
//				if((arr[i]!=arr[j])&&(arr[j]!=arr[k])&&(arr[i]!=arr[k]))
//				count++;
//			}
//		}
//	}
	cout<<count;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值