2024年蓝桥杯新手入门赛第四期

106 阅读2分钟

题目链接:www.lanqiao.cn/oj-contest/…

第一题美丽的2024,签到题。

#include <iostream>
using namespace std;
int main()
{
  int x=2024;
  int ans;
  for(int i=0;i<30;i++)
  {
    if(x>>i&1)ans++;

  }
  cout<<ans;
  return 0;
}

答案:7

第二题 自助餐 (签到题)

#include <iostream>
#include <string>
using namespace std;
string s[6]={"yuanxing","zhengfangxing","changfangxing","sanjiaoxing","tuoyuanxing","liubianxing"};
int main(){
  int n,ans=0;
  string t;
  cin>>n;
  for(int i=0;i<n;i++){
    cin>>t;
    for(int j=0;j<6;j++){
      if(t==s[j]){
        ans+=j+1; //加1确保盘子的价格从1开始计数,而不是从0开始。
      }
    }
  }
  cout<<ans<<endl;
  return 0;
}

第三题 思维题

最优的策略就是一人拿一个,这是最贪心的,拿的少才可以保证自己这一堆尽可能不会那么快用尽。

因为甲每次先拿,所以乙只要跟着甲拿就可以了,这样就只用考虑奇偶数的问题。

如果总量是奇数个,那么甲先手必赢,拿5自己举例。

如果总量是偶数个,则甲先手必输,拿6自己举例。

#include<iostream>
using namespace std;

int main()
{
  int n=0;cin>>n;
  if(n%2)cout<<"A";
  else cout<<"B";
  return 0;
}

第四题 乘飞机

如果直接暴力求解会超时

#include <bits/stdc++.h>

using namespace std;
const int N=1e5+10;
int a[N];
int main()
{
	int n,q;scanf("%d%d",&n,&q);
	for(int i =1;i<=n;i++)cin>>a[i];
for(int j=1;j<=q;j++)
{
		int r,l;scanf("%d%d",&l,&r);

			vector<int> b;
		
			for(int i=l;i<=r;i++)b.push_back(a[i]);
			sort(b.begin(),b.end()); 
            bool flag=false;
			
			
			for(int i=1;i<(int)b.size();i++)
			{
			   if(b[i]-b[i-1]<=365)	
			   {
			   	  cout << "YES" << endl;
			   	flag=true;
			   	break;
			   }
		  }
		    if(flag==false)cout << "NO" << endl; 
		}

      
return 0;
}

image.png

这里我们需要加一点优化,做剪枝。

因为想要两个人之间年龄相仿那么两个人之间不能相差超过365.

我们可以枚举从0到36500(一个人的最大年龄值),每个人之间差值为366,表示两个人年龄不相仿。 image.png

最多可以枚举100个,根据抽屉原理,第101个人肯定和前面这100个人中的一个人年龄相仿,这个时候我们输出“YES”。这样我们就可以小于100的情况我们就进行暴力求解,大于100的时候我们就不再判断而是直接判定存在年龄相仿的人。 image.png 优化代码如下:

#include <bits/stdc++.h>

using namespace std;
const int N=1e5+10;
int a[N];
int main()
{
	int n,q;scanf("%d%d",&n,&q);
	for(int i =1;i<=n;i++)cin>>a[i];
for(int j=1;j<=q;j++)
{
		int r,l;scanf("%d%d",&l,&r);
		if(r-l+1>100) cout << "YES" << endl;
		else
		{
			vector<int> b;
		
			for(int i=l;i<=r;i++)b.push_back(a[i]);
			sort(b.begin(),b.end()); 
            bool flag=false;
			
			
			for(int i=1;i<(int)b.size();i++)
			{
			   if(b[i]-b[i-1]<=365)	
			   {
			   	  cout << "YES" << endl;
			   	flag=true;
			   	break;
			   }
		  }
		    if(flag==false)cout << "NO" << endl; 
		}

      }	
return 0;
}

image.png