牛客小白月赛94

A.小笨的九宫格

题目:

在一些安全性要求较高的APP中,通常我们输入密码时,系统弹出的输入框都是乱序的。这样一来就能防止想通过观察手指点击位置来推测密码的坏人。
现在小苯有一个可能乱序的九宫格按键,但他没注意到九宫格是乱序,因此他还是按照正常九宫格顺序点击的按键。(正常九宫格:也就是按照 1 到 9 分为三行三列,从上到下,从左到右都是递增的,下方备注有图)请你告诉他,在他点击完按键后,屏幕上显示的数字都应该是什么?

样例见链接

登录—专业IT笔试面试备考平台_牛客网

ac代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>

using namespace std;

typedef long long ll;

char a[10];

int main()
{
	string t;
	string s = "";

	for (int i = 1; i < 10; i++)
	{
		cin >> a[i];
	}

	cin >> t;
	for (int i = 0; i < t.size(); i++)
	{
		s = s + (a[t[i] - '0']);
	}
	cout << s;

	return 0;
}

 B.小笨的好数组

题目:

大白熊给了小苯一个长度为 n 的数组 a,这次他希望小苯从数组中选择一个子序列(下方备注有定义解释),满足这个子序列构成的数组是一个“好数组”。大白熊定义好数组是:如果一个数组按升序排序后和原来不完全相同,则其是一个好数组。例如 [3,2,2][3,2,2][3,2,2] 升序排序后是 [2,2,3][2, 2, 3][2,2,3],和原来不完全相同,因此一个好数组,而 [1,2,2][1,2,2][1,2,2] 不是一个好数组。小苯想知道,如果想要使得选择的子序列构成一个“好数组”,最长可以选多长的子序列?

登录—专业IT笔试面试备考平台_牛客网

ac代码:

#include<iostream>
using namespace std;

const int N = 2e5+10;
int a[N];

int main()
{
    int n;
    cin >> n;
    for (int i=0; i<n; i++){
        cin >> a[i];
    }
    int ret = 0;
    int i=1;
    while(i<n && a[i-1]<=a[i]) i++;
    
    if (n>1 && i<n) cout << n;
    else cout << 0;
    
    return 0;
}

C.小笨的数字合并

题目:

大白熊给了小苯一个长度为 nnn 的数组 aaa,小苯想要最大化 aaa 的极差。
小苯想知道他最大能将数组极差变为多少呢,请你帮帮他吧。

登录—专业IT笔试面试备考平台_牛客网

 ac代码

#include <iostream>
#include <cmath>

using namespace std;
typedef long long ll;
const int N = 2e5 + 10;

ll pre[N];
ll a[N];
ll n;

int main() {
	
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		pre[i] = a[i] + pre[i - 1];
	}
	ll ans = 0;
	ll mx;
	for (int i = 1; i <= n; i++) {
		mx = max(pre[i - 1], pre[n] - pre[i]);
		ans = max(abs(mx - a[i]), ans);
	}
	cout << ans;

	return 0;
}

D.小笨的排列构造

题目:


格格有一个长度为 nnn 的排列 ppp,但她不记得 ppp 具体的样子,她只记得数组 aaa。
其中:ai=gcd(p1,p2,...,pi)a_i = gcd(p_1, p_2,...,p_i)ai​=gcd(p1​,p2​,...,pi​),也就是说,aia_iai​ 表示排列 ppp 中前 iii 个数字的最大公约数。她希望小苯将排列 ppp 复原出来,请你帮帮他吧。

(但有可能无解,这意味着格格给出的 aaa 数组可能是不正确的,此时输出 −1-1−1 即可。)

ac代码

#include<bits/stdc++.h>

using namespace std;

const int N = 2e5 + 10;
int a[N], p[N], vis[N];
int n;

int main() {
	cin >> n;
	for (int i = 1; i <= n; ++i) cin >> a[i];

	p[1] = a[1], vis[a[1]] = 1;
	for (int i = 2; i <= n; ++i) 
	{
		p[i] = a[i];
		if (a[i] == a[i - 1]) p[i] = p[i - 1];
		if (a[i - 1] % a[i] != 0) 
		{
			cout << -1;
			return 0;
		}
		while (vis[p[i]]) 
		{
			p[i] += a[i];
			if (p[i] > n) 
			{
				cout << -1;
				return 0;
			}
		}
		vis[p[i]] = 1;
	}
	for (int i = 1; i <= n; ++i) cout << p[i] << " ";


	return 0;
}

E.01背包(easy)

题目:

小苯有一个容量为 kkk 的背包,现在有 nnn 个物品,每个物品有一个体积 vvv 和价值 www,他想知道在体积不超过 kkk 的前提下,他最多能装价值为多少的物品。本问题中,物品的总体积定义为所装物品的体积的 &\&&(按位与),总价值也定义为所装物品的价值的 &\&&(按位与)。(如果不选物品,则价值为 0,所占体积也为 0。)

ac代码

#include<bits/stdc++.h>

using namespace std;
const int N = 3e3 + 10;

int v[N], w[N];

int main() {
	int n, k;
	cin >> n >> k;

	int res = 0;
	for (int i = 1; i <= n; i++)
		cin >> v[i] >> w[i];
	for (int i = 1 << 11; i >= 1; i /= 2) 
	{
		int x = (1 << 20) - 1;
		for (int j = 1; j <= n; j++) 
		{
			if ((w[j] & (res | i)) == (res | i))
				x &= v[j];
		}
		if (x <= k)
			res |= i;
	}
	cout << res;
	return 0;
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值