每周算法比赛

比赛链接:第 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; /

});

相关推荐
muke_r40 分钟前
C++——文件操作
开发语言·c++
片片叶1 小时前
C++(二)
c++
迷迭所归处1 小时前
数据结构 —— 红黑树
c++·算法
景鹤2 小时前
【算法】递归+深搜+哈希表:889.根据前序和后序遍历构造二叉树
算法
写bug的小屁孩2 小时前
登录注册窗口(一)
运维·服务器·数据库·c++·用户界面·qt6.3
LeMay083 小时前
基础算法——排序算法(冒泡排序,选择排序,堆排序,插入排序,希尔排序,归并排序,快速排序,计数排序,桶排序,基数排序,Java排序)
java·算法·排序算法
Tp_jh3 小时前
推荐一款非常好用的C/C++在线编译器
linux·c语言·c++·ide·单片机·unity·云原生
卡洛驰4 小时前
交叉熵损失函数详解
人工智能·深度学习·算法·机器学习·ai·分类·概率论
_GR5 小时前
每日OJ题_牛客_最长公共子序列_DP_C++_Java
java·开发语言·数据结构·c++·算法·leetcode
ZShiJ5 小时前
【题解】—— LeetCode一周小结44
算法·leetcode·职场和发展