A.小笨的九宫格
题目:
在一些安全性要求较高的APP中,通常我们输入密码时,系统弹出的输入框都是乱序的。这样一来就能防止想通过观察手指点击位置来推测密码的坏人。
现在小苯有一个可能乱序的九宫格按键,但他没注意到九宫格是乱序,因此他还是按照正常九宫格顺序点击的按键。(正常九宫格:也就是按照 1 到 9 分为三行三列,从上到下,从左到右都是递增的,下方备注有图)请你告诉他,在他点击完按键后,屏幕上显示的数字都应该是什么?
样例见链接
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] 不是一个好数组。小苯想知道,如果想要使得选择的子序列构成一个“好数组”,最长可以选多长的子序列?
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 的极差。
小苯想知道他最大能将数组极差变为多少呢,请你帮帮他吧。
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;
}