首页 > 其他分享 >寒假第二周——训练总结

寒假第二周——训练总结

时间:2024-02-04 20:22:38浏览次数:26  
标签:总结 vector int ll cin long 第二周 寒假 op

题解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;
}
* F - F (补题) 给两个边长为n的正方形A,B,正方形每一个格子都有一个数字,若有一个位置的数字不同,这两个正方形就不同。

我们可以将正方形绕中心顺时针旋转和逆时针旋转任意次数,问是否可以将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();
    }
}
* I - I 虽然 PHarr 喜欢听邓园长唱歌,但是没有听到自己特别喜爱的歌还是有些遗憾的。 邓园长直播间的点歌规则为「先到先服务」,即开播时观众最先点的歌会加入队列中,也可以使用钞能力。 但是作为没有经济收入的大学生的 PHarr 显然不会使用钞能力。 他知道邓园长接下来马上就要开播了,所以他决定相信自己多年单身的手速,点到自己特别喜爱的歌。 PHarr 有 n 首特别喜爱的歌,他对每首歌的喜爱程度都能用一个整数来表示,且喜爱程度各不相同,喜爱程度越大,就说明他越想点这首歌。 由于 PHarr 没有错过邓园长的每场直播,所以他知道他最想点的前 k 首歌都已经被人点过了,显然他不想浪费点歌的机会,所以他会选择第 k+1 首最想点的歌。 邓园长的直播马上就要开始了,而 PHarr 实在太过紧张,不知道自己该点的歌是哪首,所以请你帮助他尽快找到他想点的歌。

按照喜欢大小排序,删除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;
     
}
* K - K 袋鼠在一个有n个点的圆上,编号为0到n-1

你每次可以跳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;

	}
}

标签:总结,vector,int,ll,cin,long,第二周,寒假,op
From: https://www.cnblogs.com/dontian/p/18005980

相关文章

  • winter 2024 第二周周报
    内容winterweek2day1这套题复习了最短路,主要是dp,都是比较好推的dp,还是要多写dp吧,感觉写dp用的时间太久了day2这天是ccf的测试赛,测完就练了套河南大学联赛,10题看当时榜可能第八,只能说队友太给力了。写的那道l感觉挺好想的求方案数,刚开始也是在猜结论,没有想着去好好推qwq,后面......
  • 2024牛客寒假算法基础集训营1 K 牛镇公务员考试 题解
    Question2024牛客寒假算法基础集训营1K牛镇公务员考试给出一张试卷有\(n\)道单选题,每道题用一个整数\(a_i\)和一个长度为\(5\)的字符串\(s_i\)表示,其中第\(i\)道题的题面为:第\(a_i\)道题的答案是()A.\(s_1\)B.\(s_2\)C.\(s_3\)D.\(s_4\)E.\(s_5\)问:正......
  • 第二周周报
    训练赛2024蓝桥杯模拟赛2(div1+div2)题解2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛(重现赛)题解2024牛客寒假算法基础集训营1题解自主训练题解题解题解......
  • 第二周培训
    dfs深度优先搜索https://www.luogu.com.cn/problem/P8662`include<bits/stdc++.h>usingnamespacestd;intn;constintN=1010;chara[N][N];intsum,ans,cnt;intd[4][2]={0,1,0,-1,1,0,-1,0};boolf1;voiddfs(intx,inty){if(f1==false){cnt=0;for......
  • 如何做好一个信息系统项目经理,一个项目经理的个人体会和经验总结(四)
    前言说完了在项目开发阶段我的一些个人体会和经验总结,最后我们聊聊在项目验收阶段我们需要关注哪些方面的内容……项目验收阶段系统开发告一段落后,就进入客户培训、系统验收阶段,这个阶段,我一般会注意以下几个问题:1.给客户做培训前,多注意一些表面功夫大多数客户其实并不......
  • 冯梓轩图论总结2
    图论学习总结2拓补排序当给定的一张图是一张DAG(有向无环图)时,可以对该图进行拓补排序,在\(O(n+m)\)的时间内转移一些信息。通常用队列进行实现。拓补排序经常与其他算法进行结合,如DP。例题[POI2015]PUS(Pustynia)当一些数之间只给定了大小关系,要求一组可行解时,可以考虑......
  • 我的公众号2023运营总结
    转眼间已经2024了,我的公众号架构成长指南运营也算是有一年了,在这里感谢各位粉丝朋友们的关注,文末有封面红包领取,下面分享一下我这一年运营结果为什么写公众号?因为平时写笔记,同时在公司内部也会进行一些技术分享,想着在哪分享不是分享,能帮助更多人不是挺好,因此在2022年8月就开......
  • Python 基于pymongo操作Mongodb学习总结
    实践环境Python3.6.4pymongo4.1.1pymongo-3.12.3-cp36-cp36m-win_amd64.whl下载地址:https://pypi.org/simple/pymongo/代码实践#!/usr/bin/envpython#-*-coding:utf-8-*-importdatetimeimportrandomimportpymongofrompymongoimportMongoClientfrombson.objecti......
  • 寒假day3 2.4
    讲师:钟皓曦,NOI2012Au,from成都七中听课能听懂30%就算成功**dp关键:状态、转移、初始化转移:状态与状态之间的关系初始化:状态的边界条件数字三角形状态:\(f_{i,j}\)表示走到\(a_{i,j}\)这个位置的最大价值。如何设计状态?题目要你干什么——从第一行走到最后一行该过程......
  • 高等数学の总结
    写在「开始」之前:由于笔者在八年级时就开始学习高等数学,由于学习速度比较快,可能有的地方有缺失或疏漏,如有不足之处请指出,thx一、映射与连续1.定义:设\(A\)与\(B\)是两个非空集合,如果我们定义一种对应关系\(f\),使得对于\(A\)中的每一个元素\(a\),通过\(f\)处理之后,......