蓝桥杯赛前模拟

A-似巨龙高歌 

题意

对考试的名次重新排序,使得进步最大的进步名次最少。

思路

按照名次从小到大进行排序,这样保证了进步的名次最少,从而取进步的最大值。

代码

#include<bits/stdc++.h>
#define PII pair<int,int>
using namespace std;
typedef long long ll;
const int N=1e7+9,mod=998244353;
int a[N],b[N];
void solve()
{
	int n;
	cin >> n;
	for(int i = 1;i <= n; i++) cin >> a[i];
	sort(a + 1, a + n + 1);
	int ans=INT_MIN;
	for(int i = 1;i < n; i++){
		ans = max(ans,a[i]-a[i+1]);
	}
	cout << ans << '\n';
}
signed main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//	solve();
	int T;
	T=1;
//	cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

B-「KDOI-06-J」翻转与反转 

题意

对于一个01数组,分别在1-n区间内对数组进行两次操作:1:将[1,i]内数字进行翻转 2:将[1,i]内的所对应的值进行反转(0变为1,1变为0)。

思路

模拟过程发现:当n为奇数时:a1,a2,a3,a4,a5-->!a5,!a3,!a1,a2,a4,即:原下标为奇数的取反逆序排列在前,原下标为偶数正序排列在后;当n为偶数时:a1,a2,a3,a4-->!a4,!a2,a1,a3,即:原下标为偶数的取反逆序排列在前,原下标为奇数的正序排列在后。

代码

#include<bits/stdc++.h>
#define PII pair<int,int>
using namespace std;
typedef long long ll;
const int N=1e7+9,mod=998244353;
int a[N],b[N];
void solve()
{
	int n;
	cin >> n;
	for(int i = 1;i <= n; i++) cin >> a[i];
	int k = 1;
	if(n & 1)
	{
		for(int i = n; i >= 1; i--){
			if(i & 1){
				if(a[i] == 1) b[k++] = 0;
				else b[k++] = 1;
			}
		}
		for(int i = 1; i <= n; i++){
			if(i % 2 == 0){
				b[k++] = a[i];
			}
		}
	}
	else
	{
		for(int i = n;i >= 1; i--){
			if(i % 2 == 0){
				if(a[i] == 1) b[k++] = 0;
				else b[k++] = 1;
			}
		}
		for(int i =1 ;i <= n; i++){
			if(i & 1){
				b[k++] = a[i];
			}
		}
	}
	for(int i = 1; i <= n; i++)
	cout << b[i] << ' ';
}
signed main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//	solve();
	int T;
	T=1;
//	cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

D-[CSP-J 2023] 公路 

题意

在一条公路上有n个站点,已知每一个站点距离下一个站点的路程以及每个站点的油价,求解从第1个站点到达第n个站点时,最少的油费。

思路

到达一个站点时,肯定是由前一个站点加油而来,那么我们每个站点的油价等于自身与前一个站点的油价的最小值,这样保证了花费最少,并且每次都要判断到达该站点之后距离下一个站点的距离(可能上次所加的油还没有用完)。

代码

#include<bits/stdc++.h>
#define PII pair<int,int>
using namespace std;
typedef long long ll;
const int N=1e6+9,mod=998244353;
ll b[N],a[N];
ll vis[N];
void solve()
{
	int n,d;
	cin >> n >> d;
	for(int i = 1;i < n;i++)
	cin >> a[i];//距离 
	for(int i = 1;i <= n;i++)
	cin >> b[i]; //价钱 
	for(int i = 2;i <= n;i++)
	b[i] = min(b[i-1],b[i]);
	ll sum = 0,temp = 0;
	for(int i = 1;i < n;i++){
		temp += a[i]; //距离下一个点的距离 
		if(temp > 0){
			sum += ((temp + d -1) / d) * b[i];
		}
		temp = temp - ((temp + d -1) / d) * d;
//		cout << temp << '\n';
	}
	cout << sum << '\n';
}
signed main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//	solve();
	int T;
	T=1;
//	cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

 E-[CSP-J 2023] 小苹果 

题意

一共有n个苹果,从第一个开始取,每隔两个取一个;随后苹果继续排序,第二天按照规则继续取,求解多少天能取完这n个苹果且第n个苹果是在第几天取走的。

思路

模拟发现,每次取的苹果都是下标除3余1的值,并且每天取得的苹果总数为(n + 3 - 1) / 3

代码

#include<bits/stdc++.h>
#define PII pair<int,int>
using namespace std;
typedef long long ll;
const int N=1e7+9,mod=998244353;
int a[N],b[N],vis[N];
void solve()
{
	int n;
	cin >> n;
	int f = 0,cnt = 0;
	while(n){
		cnt++;
		if(n == 0) break;
		if(n % 3 == 1 && !f) f = cnt;
		n -= (n + 3 - 1) / 3;
	}
	cout << cnt << " " << f << endl;
}
signed main()
{
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
//	solve();
	int T;
	T=1;
//	cin>>T;
	while(T--)
	{
		solve();
	}
	return 0;
}

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值