题解1
A题,给n个英文字母,你可以组成最长的回文串长度是多少?
现在,请你利用程序帮助算出他能构成的最长回文串的长度是多少。
用桶排的方法,记录字母的数量,然后把双数的数量×2,加上超过二的单数/2的奇数加1即可,需要判断只需要
有一个超过2的奇数就在结果加一就行。
- A——A
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll q[125];
int ans=0;
char d;
int m;
int n;
bool yes =false;
int main ()
{
int max=0;
memset(q,0,sizeof(q));//c language
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&m);
getchar();
for(int j=1;j<=m;j++){
cin>>d;
q[(int)d]++;
}
if(m==1)
cout<<1<<endl;
else if (m==2)
{
if(q[(int)d]==2)
{
cout<<2<<endl;
}else
cout<<1<<endl;
}
else if(m>=3)
{
for(int k=65;k<=123;k++)
{
if(q[k]%2==0&&q[k]!=0)
ans+=q[k];
else if(q[k]%2!=0&&q[k]!=0)
{
if(q[k]>2)
ans+=(q[k]/2)*2;
yes=true;
}
}
if(yes)
ans+=1;
cout<<ans<<endl;
ans=0;
max=0;
yes=false;
}
memset(q,0,sizeof(q));//c language
}
}
B题
- B-B
给一个数组,问你可以求出多少个总和为7777
的子区间。
这道题我看到求子曲和的时候,想法就是前缀和,但我一开始写的时候 前缀和的时间复杂度太大,会TLE,因此我想到可以使用
二分或者双指针的方法求解。
点击查看代码
#include <iostream>
#include <vector>
using namespace std;
int countSubarraysWithSum(vector<int>& nums, int target) {
int count = 0;
int left = 0;
int right = 0;
int sum = 0;
while (right < nums.size()) {
sum += nums[right];
while (sum > target) {
sum -= nums[left];
left++;
}
if (sum == target) {
count += 1; // 找到一个子数组
sum -= nums[left]; // 将左指针向右移动
left++;
}
right++;
}
return count;
}
int main() {
int T;
cin >> T;
for (int i = 0; i < T; i++) {
int n;
cin >> n;
vector<int> nums(n);
for (int j = 0; j < n; j++) {
cin >> nums[j];
}
int count = countSubarraysWithSum(nums, 7777);
cout << count << endl;
}
return 0;
}
C题(补题)
无限大的二维地图上有N个宝物,你起初在原点,当你走到物品的位置就会拿起
游戏的前提:你只能在x或y坐标轴上移动,当你这次移动到坐标轴外,会被强行到达原点
您需要模拟 Q
次操作,操作仅会包含如下 4
种
1 X|Y d
2 X|Y
3
4 T
操作 1
,沿着 X
或 Y
轴正方向走 step
步,注意 step
可能会出现负数 (−105≤step≤105)
操作 2
,此时 X
或 Y
轴上的物品会以原点为中心对称变换位置
操作 3
,X
轴上的所有物品绕原点逆时针旋转 90
度, Y
轴上的所有物品绕原点顺时针旋转 90
度
操作 4
,你会乘坐时光机回到第 T
次操作执行前所在的状态(包括坐标系的状态,你的位置和你获得的物品),注意仅仅会将状态变为第 T
次操作前一次的状态(假设当前操作是输入的第 i
个操作,那么执行完此次操作后,仍会进行第 i+1
次操作,且保证 1≤T≤i
)
请输出执行完 Q
次操作后所获得的物品个数。
diamond:
点击查看代码
#include <bits/stdc++.h>
using namespace std;
struct state {
int x, y, sum;
vector<int> X, Y;
///初始化啦,把s数组中的物品加入到两个坐标轴数组之中,然后排序,方便后面的二分,不二分也可以过
state(const vector<pair<int, int>> &s) {
x = y = sum = 0;
///c++17用法[]用法
for (auto [r, c]: s) {
if (r == 0) Y.push_back(c);
if (c == 0) X.push_back(r);
}
sort(X.begin(), X.end()), sort(Y.begin(), Y.end());
}
///操作1,你当前在(x,y),如果你走到坐标轴之外,那么你就返回原点
///你从l走到了r,然后把这个路程的物品加入cur之中,在X或Y数组中二分删除cur之中的物品,然后更新坐标
void op1(char op, int t) {
if ((op == 'X' && (x + t) * y != 0) || (op == 'Y' && x * (y + t) != 0)) return x = y = 0, void();
if (op == 'X') {
vector<int> cur;
int l = min(x, x + t), r = max(x, x + t);
for (auto i: X)
if (i >= l && i <= r) cur.push_back(i);
for (auto i: cur)
X.erase(lower_bound(X.begin(), X.end(), i));
sum += cur.size(), x += t;
} else {
vector<int> cur;
int l = min(y, y + t), r = max(y, y + t);
for (auto i: Y) if (i >= l && i <= r) cur.push_back(i);
for (auto i: cur)
Y.erase(lower_bound(Y.begin(), Y.end(), i));
sum += cur.size(), y += t;
}
return;
}
////操作2,中心对称变换
void op2(char op) {
if (op == 'X') {
for (auto &i: X) i = -i;
sort(X.begin(), X.end());
} else {
for (auto &i: Y) i = -i;
sort(Y.begin(), Y.end());
}
op1('X', 0), op1('Y', 0);
return;
}
////操作3,我们可以这样处理,将两轴交换,然后进行操作1,即可
void op3() {
swap(X, Y);
op1('X', 0), op1('Y', 0);
return;
}
};
signed main() {
int n;
cin>>n;
vector<pair<int, int>> a(n);//物品的坐标
for (auto &[x, y]: a) cin>>x>>y;
state now(a);//初始化now这个结构体
vector<state> T;////记录每一个操作的now结构体
T.push_back(now);
char s[2];
int m;
cin>>m;
for (int i = 1, op, t; i <= m; i++) {
cin>>op;
if (op == 1) {
cin>>s>>t;
now.op1(s[0], t);
} else if (op == 2) {
cin>>s;
now.op2(s[0]);
} else if (op == 3) {
now.op3();
} else if (op == 4) {
cin>>t;
if (t != i) now = T[t - 1];
////操作四直接返回第t次操作
}
///把每一次操作加入
T.push_back(now);
}
cout << now.sum << "\n";
return 0;
}
- D - D
有一天,mob遇到一个很棘手的问题,问遍了周围的同学都不能解释。
在mob遇到人生挫折的时候想起了一位学长—— Joler。
但 Joler 有一个小毛病,说话东一句西一句。
这个毛病形式上的说,一句话有 n个单词,每个单词为 ai(1≤i≤n)。
Joler会以 "a1a3a5⋯a6a4a2" 的形式说。
实际上他想说的是:
a1a2a3a4a5a6⋯
例如Joler说:"This an problem easy is."
但他其实是想说:"This is an easy problem."
mob非常想知道 Joler 的教诲,请你帮帮他吧!
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod=998244353;
ll n,h[2005];
int main(){
cin>>n;
ll x=0;
for (int i = 0; i <n ; ++i) {
ll g;
cin>>g;
x+=g;
}
ll ans=0;
ll y=1;
for (int i = 0; i <n-1 ; ++i) {
y=(y%mod)*((3+i))%mod;
}
ans=(x%mod)*(y%mod)%mod;
cout<<ans;
}
我们可以将正方形绕中心顺时针旋转和逆时针旋转任意次数,问是否可以将A正方形旋转为B正方形,如果可以问最少次数是多少,如果不可以输出-1
+/*-.
点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
void solve(){
vector<vector<int>>g(25,vector<int>(25));
vector<vector<int>>sc(25,vector<int>(25));
int n;
cin>>n;
for (int i = 1; i <=n ; ++i) {
for (int j = 1; j <=n ; ++j) {
cin>>g[i][j];
}
}
int st0=1,st1=1,st2=2,st3=1;
for (int i = 1; i <=n ; ++i) {
for (int j = 1; j <=n ; ++j) {
cin>>sc[i][j];
if(sc[i][j]!=g[i][j])st0=0;
}
}
if(st0){
cout<<"0\n";
return;
}
///逆时针旋转
for (int i = 1; i <=n ; ++i) {
for (int j = 1; j <=n ; ++j) {
if(g[i][j]!=sc[n-i+1][n-j+1]){
st2=4;
}
}
}
///旋转180
for (int i = 1; i <=n ; ++i) {
for (int j = 1; j <=n ; ++j) {
if(sc[i][j]!=g[j][n-i+1])st1=4;
}
}
///顺时针旋转
for (int i = 1; i <=n ; ++i) {
for (int j = 1; j <=n ; ++j) {
if(sc[i][j]!=g[n-j+1][i])st3=4;
}
}
int ans=min({st1,st2,st3});
if(ans==4){
cout<<"-1\n";
}
else{
cout<<ans<<'\n';
}
}
signed main() {
ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
int t=1;
cin>>t;
while (t--){
solve();
}
}
按照喜欢大小排序,删除t个,输出n-t-1个元素即可。
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct Node
{
ll love;
char m[20];
}node[100001];
bool cmp(Node a,Node b)
{
if(a.love==b.love) //如果两个结构体的y相同,按它们的x值从小到大排列
return a.m<b.m;
else return a.love<b.love; // 反之按y从小到大排列
}
int main ()
{
int n,t;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>node[i].love>>node[i].m;
}
cin>>t;
sort(node,node+n,cmp);
if(t==0)
cout<<node[n-1].m<<endl;
else
cout<<node[n-t-1].m<<endl;
}
你每次可以跳x长度
比如你从0跳到x
请你判断一下无限次数的跳跃(>=1)是否可以从0点跳回0点
只有两种可能,x==0,x>0,输出即可
点击查看代码
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll q[1000002];
int main ()
{
int t,x,n;
cin>>t;
for(int i=1;i<=t;i++){
cin>>n>>x;
if(x==0)
cout<<"no"<<endl;
else if(x>0)
cout<<"yes"<<endl;
}
}