每周算法比赛

比赛链接:第 21 场 小白入门赛 - 蓝桥云课

1.动态密码

cpp 复制代码
#include <iostream>
using namespace std;
int main()
{
	char result[10010];
	cout<<itoa(20241111,result,2)<<endl;
	return 0;
}

2.购物车的宝贝

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int a[100010];
int main()
{
	cin>>n;
	for(int i=0; i<n; i++)
	{
		cin>>a[i];
	}
	int sum=a[0]; 
	for(int i=1; i<n; i++)
	{
		sum^=a[i];
	}
	if(sum==0)
	{
		cout<<"YES"<<endl;
	}
	else
	{
		cout<<"NO"<<endl;
	}
	return 0;
}

3.代金券

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll t,num;
int main()
{
	cin>>t;
	while(t--)
	{
		ll n,m;
		cin>>n>>m;
		string temp=to_string(n);
		ll min_num=LLONG_MAX;
		for(int i=0;i<=temp.size();i++)
		{
			for(int j=0;j<=9;j++)
			{
				string new_temp=temp;
				new_temp.insert(i,to_string(j));
				num=stoll(new_temp);
				if(num>n && (num%m==0))
				{
					min_num=min(min_num,num);
				}
			}
		}
		if(min_num==num)
		{
			cout<<-1<<endl;
		}
		else
		{
			cout<<min_num<<endl;
		}
	}
	return 0;
}

4.蓝桥商场

cpp 复制代码
// 贪心最优策略:交替吃食物,当食物最多的超过其他之和,此时会等待浪费时间 
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,sum=0;
int a[100010]; 
int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
		sum+=a[i];
	}
	sort(a,a+n);
	cout<<max(sum,2*a[n-1]-1)<<endl;
	return 0;
}

5.蓝桥派对

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
int n,m;
typedef pair<int,int>num;
vector<num>nums;
int main()
{
	cin>>n>>m;
	int a[n],b[n];
	for(int i=0;i<n;i++)
	{
		cin>>a[i]>>b[i];
		nums.emplace_back(a[i],b[i]);
	}
	sort(a,a+n);
	sort(b,b+n);
	int f[n];
	for(int i=0;i<n;i++)
	{
		int l=nums[i].first; //开始点 
		int r=nums[i].second; //结束点 
		int front=upper_bound(a,a+n,r)-a; //在结束点之前开始的所有人
		int end=lower_bound(b,b+n,l)-b; //在开始点之前结束的所有人
		f[i]=front-end-1; //所有开始-所有结束=区间内的交朋友个数 
	}
	for(auto x:f)
	{
		cout<<x<<endl;
	}
	return 0;
}

6.薅羊毛

cpp 复制代码
//相邻数最小公倍数就是相邻数相乘(没有公因子) 
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
ll l,r,sum=0;
ll qmi(ll b,ll q,ll k)
{
	ll res=1;
	while(q)
	{
		if(q&1) res=res*b%k;
		q>>=1;
		b=b*b%k;
	}
	return res;
}

int main()
{
	cin>>l>>r;
	for(int i=l;i<r;i++)
	{
		sum=(sum+qmi(i,i,mod)*qmi(i+1,i+1,mod)%mod)%mod; 
	}
	cout<<sum<<endl;
	return 0;
}

7.小H学语文

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n;
ll h[200010];
typedef pair<int,int>num;
vector<num>nums;
int main()
{
	cin>>n;
	for(int i=0; i<n; i++)
	{
		cin>>h[i];
		nums.push_back({i+1,h[i]});
	}
	//算出最大(从数组h[]中选择x个数,x的平方乘以x个数的最小值)
	sort(nums.begin(), nums.end(), [](const pair<int, int> &a, const pair<int, int> &b)
	{
		return a.second < b.second; // 按高度升序排序
	});
	ll max1=0,sum1=0; //最大体积,木板数
	vector<int>index; //索引
	for(int i=1; i<=n; i++)
	{
		int result = i*i*nums[n-i].second; //从排序的尾部选木板数量,nums从0开始
		if(result>max1)
		{
			max1=result;
			sum1=i;
		}
	}
	cout<<sum1<<endl;
	for(int j=n-sum1; j<n; j++)
	{
		index.push_back(nums[j].first);
	}
	sort(index.begin(),index.end());
	for(int t:index)
	{
		cout<<t<<" ";
	}
	return 0;
}

总结知识点:

1.itoa()函数用法

  1. ^位运算

3.字符串插入insert(i,to_string(j)),stoll()函数用法,LLONG_MAX

4.nums.emplace_back(),upper_bound()和lower_bound()二分用法

5.快速幂

6.新的排序方法:

sort(nums.begin(), nums.end(), [](const pair<int, int> &a, const pair<int, int> &b)

{

return a.second < b.second; /

});

相关推荐
业精于勤的牙5 小时前
浅谈:算法中的斐波那契数(二)
算法·职场和发展
不穿格子的程序员5 小时前
从零开始写算法——链表篇4:删除链表的倒数第 N 个结点 + 两两交换链表中的节点
数据结构·算法·链表
liuyao_xianhui6 小时前
寻找峰值--优选算法(二分查找法)
算法
dragoooon346 小时前
[hot100 NO.19~24]
数据结构·算法
神仙别闹6 小时前
基于QT(C++)实现学本科教务系统(URP系统)
数据库·c++·qt
deng-c-f6 小时前
Linux C/C++ 学习日记(49):线程池
c++·学习·线程池
电子硬件笔记6 小时前
Python语言编程导论第七章 数据结构
开发语言·数据结构·python
ulias2127 小时前
C++ 的容器适配器——从stack/queue看
开发语言·c++
daidaidaiyu7 小时前
FFmpeg 关键的结构体
c++·ffmpeg
Tony_yitao7 小时前
15.华为OD机考 - 执行任务赚积分
数据结构·算法·华为od·algorithm