首页 > 其他分享 >2024牛客寒假集训营第二场

2024牛客寒假集训营第二场

时间:2024-02-05 22:22:55浏览次数:28  
标签:typedef const int long 2024 牛客 pair 集训营 define

  • 总的来说,这一场还是很不错的,但是还是有做的不好的地方,比方说靠别人给了D的思路,还有思维的太慢。不过继续努力吧!
  • A.Tokitsukaze and Bracelet
  1. 思路:签到题,直接按着题目的意思模拟就可以了。
  2. code:
点击查看代码
#include<bits/stdc++.h>                      
using namespace std;
#define fi first
#define se second
#define lc p<<1
#define rc p<<1|1
//#define int long long
#define vi vector<int>
#define vpi vector<pair<int,int>>
#define vvi vector<vector<int>>
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<ll,pair<ll,ll>> PIII;
typedef pair<ll,pair<ll,pair<ll,ll>>> pIIII;
const int N = 2e5 + 7;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
void solve() {
    int a,b,c;cin >> a >> b >> c;
    int sum = 0;
    if(a == 150) sum += 1;
    else if(a == 200) sum += 2;
    if(b == 34 || b == 36 || b == 38 || b == 40) sum += 1;
    else if(b == 45) sum += 2;
    if(c == 34 || c == 36 || c == 38 || c == 40) sum += 1;
    else if(c == 45) sum += 2;
    cout << sum << "\n";
}
signed main() {	
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	int t = 1;
	cin >> t;
	while(t--) {
		solve();
	}
    //system("pause");
	return 0;
}
/*
Do smth instead of nothing and stay organized
Don't get stuck on one approach
*/
  1. 思路:我们可以发现,如果有两只猫互相相邻(一只在另外一只的上、下、左、右),那么两只猫之前用的隔板数量就会减1,然后由于a和b相邻的那么b和a也是相邻的,所以记得除2。
  2. code:
点击查看代码
#include<bits/stdc++.h>                      
using namespace std;
#define fi first
#define se second
#define lc p<<1
#define rc p<<1|1
//#define int long long
#define vi vector<int>
#define vpi vector<pair<int,int>>
#define vvi vector<vector<int>>
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<ll,pair<ll,ll>> PIII;
typedef pair<ll,pair<ll,pair<ll,ll>>> pIIII;
const int N = 2e5 + 7;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
int dir[5][5] = {{-1,0},{1,0},{0,1},{0,-1}};
int n,m;
bool inmap(int x,int y) {
    return (x >= 1 && x <= n && y >= 1 && y <= m);
}
void solve() {
    int k;
    cin >> n >> m >> k;
    vvi st(n + 1,vi(m + 1));
    vi x(n + 1),y(m + 1);
    for(int i = 1; i <= k; i++) {
        cin >> x[i] >> y[i];
        st[x[i]][y[i]] = 1;
    }
    int cnt = 0;
    for(int i = 1; i <= k; i++) {
        for(int j = 0; j < 4; j++) {
            int dx = x[i] + dir[j][0];
            int dy = y[i] + dir[j][1];
            if(inmap(dx,dy)) 
                if(st[dx][dy]) cnt++;
        }
    }
    //cout << cnt << "\n";
    cout << k*4 - cnt/2 << "\n";
}
signed main() {	
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	int t = 1;
	//cin >> t;
	while(t--) {
		solve();
	}
    //system("pause");
	return 0;
}
/*
Do smth instead of nothing and stay organized
Don't get stuck on one approach
*/
  1. 思路分析:
    这题是个最短路问题,因为考虑到n在5000以内,m在1000以内,所以总共就n张牌。所以我们可以考虑对于每个点去考虑用每个技能牌能够到达哪个位置。由于是从当前位置往“上”走,所以对于可以到达的点建一个单向边就可以了。所以我们考虑从牌堆底部到牌堆顶部的牌的编号是n到1,那么我们要求的就是从k号点走到n号点。所以直接Dijkstra就可以了,实现起来不是很复杂。我这题是在太过极限了,2分钟写完,然后一直找不到哪里错了,直道想到自己数组可能没有清空才改对,对的时候还有两秒结束比赛。汗流浃背。
  2. code
点击查看代码
#include<bits/stdc++.h>                      
using namespace std;
#define fi first
#define se second
#define lc p<<1
#define rc p<<1|1
#define int long long
#define vi vector<long long>
#define vpi vector<pair<long long,long long>>
#define vvi vector<vector<int>>
typedef long long ll;
typedef pair<long long,long long> PII;
typedef pair<ll,pair<ll,ll>> PIII;
typedef pair<ll,pair<ll,pair<ll,ll>>> pIIII;
const int N = 7000 + 7;
const long long inf = 1e18;
const int mod = 998244353;
vpi g[N];
vi dis(N),vis(N);
int n,m,k;
void Dijkstra(int s) {
	priority_queue<PII,vector<PII>,greater<PII>> q;
	for(int i = 1; i <= N - 1; i++) dis[i] = inf;
	dis[k] = 0;
	q.push({0,k});
	while(!q.empty()) {
		auto t = q.top();q.pop();
		if(vis[t.second]) continue;
		vis[t.second] = 1;	
		for(auto i : g[t.second]) {
			if(dis[i.fi] > dis[t.second] + i.se) {
				dis[i.fi] = dis[t.second] + i.se;
				q.push({dis[i.fi],i.fi});
			}
		}
	}
}
void solve() {
    cin >> n >> m >> k;
    vi a(N),b(N);
    for(int i = 1; i <= N - 1; i++) {
        g[i].clear();
    }
    for(int i = 1; i <= m; i++) {
        cin >> a[i] >> b[i];
        for(int j = 1; j <= n; j++) {
            int v = (j + a[i] - 1)%n + 1;
            g[j].push_back({v,b[i]});
        }
    }
    fill(vis.begin(),vis.end(),0);
    Dijkstra(k);
    if(dis[n] == 1e18 || dis[n] < 0) cout << "-1\n";
    else cout << dis[n] << "\n";
}
signed main() {	
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	int t = 1;
	cin >> t;
	while(t--) {
		solve();
	}
    //system("pause");
	return 0;
}
/*
Do smth instead of nothing and stay organized
Don't get stuck on one approach
*/
  1. 思路分析:这是我第一个AC的题目,没想到居然A,B才是签到题。我第一个看这个题是因为这个题目比较短hhh。所以对于这个题,由于不同的数字最多就两个,所以可以直接暴力从右到左寻找每个集齐这几个不同的元素的区间,然后直接删掉就好了。如果没找到,那么肯定只能一个一个删掉,所以说这个策略一定是最优的。
  2. code:
点击查看代码
#include<bits/stdc++.h>                      
using namespace std;
#define fi first
#define se second
#define lc p<<1
#define rc p<<1|1
//#define int long long
#define vi vector<int>
#define vpi vector<pair<int,int>>
#define vvi vector<vector<int>>
typedef long long ll;
typedef pair<int,int> PII;
typedef pair<ll,pair<ll,ll>> PIII;
typedef pair<ll,pair<ll,pair<ll,ll>>> pIIII;
const int N = 2e5 + 7;
const int inf = 0x3f3f3f3f;
const int mod = 998244353;
void solve() {
    int n;cin >> n;
	vi a(n + 1);
	int dif = 0;
	set<int> s;
	for(int i = 1; i <= n; i++) {
		cin >> a[i];
		s.insert(a[i]);
	}
	dif = s.size();
	set<int> st;
	int cnt = 0,last,res = 0;
	for(int i = n; i >= 1; i--) {
		st.insert(a[i]);
		res++;
		if(st.size() == dif) {
			res = 0;
			cnt++,st.clear();
			last = i;
		}
	}
	cnt += res;
	cout << cnt << "\n";
}
signed main() {	
	std::ios::sync_with_stdio(0);
	std::cin.tie(0);
	int t = 1;
	cin >> t;
	while(t--) {
		solve();
	}
    //system("pause");
	return 0;
}
/*
Do smth instead of nothing and stay organized
Don't get stuck on one approach
*/
  1. 思路分析:这里我们可以发现,不同的数字已经变得更多了,所以上一题的贪心不一定还适用,因为我们可以考虑一下这个样例:1 2 1 2 3,就会发现正确的应该是2,但是由上一题的思路我跑出来的是3。所以要换一个新的思路!

标签:typedef,const,int,long,2024,牛客,pair,集训营,define
From: https://www.cnblogs.com/Jerry114514/p/18008918

相关文章

  • 牛客周赛 Round 31
    牛客周赛Round31小红小紫替换代码:#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;usingpii=pair<ll,ll>;#definefifirst#definesesecondusingi128=__int128_t;usingpiii=pair<ll,pair<ll,ll>>;voidsolve(){......
  • 牛客比赛2.5
    比赛链接9题,就看结果来说还是不错的,但是过程我是很不满意的。。A,B签到题,没什么说的必要。C题,数据结构题,很烦,trie树带查询,码起来有些麻烦,考试的时候没有开。其实思路很简单,用01trie树,对每一个点,查找比他小的和它异或起来最大的数字,这个东西在trie树上就是一个贪心,O(logn)级别......
  • 2024初三寒假年前集训测试3
    2024初三年前集训测试3ps:也不知道我为什么没写测试1,2的题解T1夕景昨日\(100pts\)题目描述\(Shintaro\)制作了\(n\)个开关,每个开关的状态可被设置为\(+\)或\(-\)。现在你有一个数列$A=(a_1,a_2,\dots,a_n)$,和一个初始值为\(0\)的变量\(v\)。你可以自由地操......
  • 协同办公的2024开年大战,打的就是“超级助理”
    文|智能相对论作者|沈浪开年,腾讯发布了一份报告《影响2024年的十大科技应用趋势》。其中提到,从大脑到Agent,大模型从CoPilot副驾,走向主驾驶。在不久的将来,任何上网的人都将能够拥有由人工智能驱动的个人助手,远超今天的技术水平。这一趋势,或许并不遥远。尽管腾讯旗下的企业微信还没有......
  • 耗时一个月我问遍了身边的大佬,零基础自学Java的路线,适用程序员入门&进阶,Java学习路线,2
    作为一个有志于成为Java程序员的你,或许正处在技术生涯的起点,或许已经走过了入门的道路,期待跨越进阶的门槛?无论处于哪个阶段,一条明确的学习路线都至关重要,通过向众多行业大佬请教、反复探索和实践,总结出一套适用于零基础自学者大学四年Java学习路线,也同样适用于从初级到研发专家的学......
  • 寒假训练第3周(牛客冬训营)
    F-TokitsukazeandEliminate(hard)_2024牛客寒假算法基础集训营2(nowcoder.com)脑袋堵住了,红温没有写出来,后面想到思路直接给否定了,可惜题解:需要你找最右边第一个,直接先统计一下有多少个颜色的宝石,然后从左往右依次放入set到相应的颜色数就加答案,然后如果这种颜色宝石没有了......
  • 2024.2.5寒假每日总结27
    LeetCode跳跃游戏VI1696.跳跃游戏VI-力扣(LeetCode)题目描述给你一个下标从0开始的整数数组nums和一个整数k。一开始你在下标0处。每一步,你最多可以往前跳k步,但你不能跳出数组的边界。也就是说,你可以从下标i跳到[i+1,min(n-1,i+k)]包含两个端点的任......
  • 杂记 2024-02-05 农历腊月26,星期一
    1.java继承时,子类Override父类方法的限制:从这里抄的https://www.cnblogs.com/aademeng/articles/11230526.html遵循的规则:【1】访问修饰符的限制一定要不小于被重写方法的访问修饰符比如:Object类有个toString()方法,开始重写这个方法的时候我们总容易忘记Public修饰符,出错的原因......
  • THUWC2024 游记
    标题已经过和谐。内容已经过和谐。Day0等待cool_milo。他来了。检查身份证和现金。思来想去决定携带红楼梦,然而并没有什么用。走到一中后门,等待教练打印准考证。打印好了,绕远路前往小龙坎站乘坐一号线。形如初中生秋游。经过换乘抵达黄花园,出站看见巴蜀中学国际部,非常气......
  • 2024牛客寒假算法基础集训营2(小白)
    A.TokitsukazeandBraceletCode:#include<bits/stdc++.h>usingnamespacestd;intmain(){intt;cin>>t;while(t--){inta,b,c,cnt=0;cin>>a>>b>>c;if(a>=150)cnt++;if(a>=200)......