题解:牛客小白月赛102(A - C)
A 序列中的排列
题意:
每次给你两个正整数
问:原序列中是否存在子序列,使得这个子序列是
子序列:某个序列的子序列是从最初序列通过去除某些元素但不破坏余下元素的相对位置(在前或在后)而形成的新序列。
排列:一个
做法:
只要找到序列中是否存在
可以使用计数数组(数据范围也不大)
代码:
#include <iostream> #include <algorithm> #include <map> void solve() { int max = -1; int n,m,num,cnt = 0; std::cin >> n >> m; std::map<int,int> mp; for(int i = 0 ; i < n ; i ++) { std::cin >> num; if(num <= m && !mp.count(num)) cnt ++,max = std::max(max,num);; mp[num] ++; } std::cout << (max == m && cnt == m ? "YES\n" : "NO\n"); } signed main(){ std::ios::sync_with_stdio(0); std::cin.tie(0); std::cout.tie(0); int t = 1; std::cin >> t; while(t--) solve(); return 0; }
B 连分数
题意:
(有点抽象,我直接放原文吧)
给定
求
形式上说,设
(
做法1及其代码:
大家都学过极限,了解了极限的思想,那这题我们就好做了
首先,当
正因如此,假设
于是我们可以列出以下式子
移项得(易证
于是我们只要找出这个
如果我们会求根公式的话,就可以求根公式直接上了
#include <bits/stdc++.h> #define int long long #define INF 0x3f3f3f3f void solve() { double a; std::cin >> a; printf("%.10f\n",(a + sqrt(a*a + 4)) / 2); } signed main(){ std::ios::sync_with_stdio(0); std::cin.tie(0); int t = 1; std::cin >> t; while(t--) solve(); return 0; }
如果不会求根公式的话,也没关系。
不难看出,
于是我们可以进行实数二分
最小值设置个
#include <bits/stdc++.h> #define int long long #define INF 0x3f3f3f3f const double eps = 1e-9; void solve() { double a; std::cin >> a; double l = 1,r = 1e5 + 1; while(fabs(l-r) >= eps) { double mid = (l + r) / 2; if(mid * mid - a * mid - 1 >= 0) r = mid; else l = mid; } printf("%.10f\n",l); } signed main(){ std::ios::sync_with_stdio(0); std::cin.tie(0); int t = 1; std::cin >> t; while(t--) solve(); return 0; }
做法2及其代码:
如果说,我没想到上面的思想,能不能模拟?
可以!
但是要做一点小运算
举个例子:
因为是第一个是
第二个不就是
你手动模拟下就发现
每一次的值都是:前面得到的分数分子分母互换,然后分子加上分母的
ok,然后我们直接写就可以了
#include <bits/stdc++.h> #define int long long #define INF 0x3f3f3f3f const double eps = 1e-9; void solve() { double a; std::cin >> a; double fz = a,fm = 1,c = fz / fm; std::swap(fz,fm); fz += fm*a; while(fabs(c - fz / fm) > 1e-10) { c = fz / fm; std::swap(fz,fm); fz += fm*a; } printf("%.10f\n",fz/fm); } signed main(){ std::ios::sync_with_stdio(0); std::cin.tie(0); int t = 1; std::cin >> t; while(t--) solve(); return 0; }
C sum
题意:
给你
已知有
问最少多少次操作使得这
做法:
很经典的贪心,总和比
代码:
#include <bits/stdc++.h> #define int long long #define INF 0x3f3f3f3f #define all(x) x.begin(),x.end() void solve() { int n,m,sum = 0,ans = 0; std::cin >> n >> m; std::vector<int> a(n); for(int i = 0 ; i < n ; i ++) std::cin >> a[i],sum += a[i]; std::sort(all(a)); if(sum == m) std::cout << 0 << "\n"; else if(sum > m) { for(int i = n-1 ; i >= 0 ; i --) { ans ++; if(sum - (a[i] + 1e4) <= m) break; sum -= (a[i] + 1e4); } std::cout << ans << "\n"; } else { for(int i = 0 ; i < n ; i ++) { ans ++; if(sum + (1e4 - a[i]) >= m) break; sum += (1e4 - a[i]); } std::cout << ans << "\n"; } } signed main(){ std::ios::sync_with_stdio(0); std::cin.tie(0); int t = 1; std::cin >> t; while(t--) solve(); return 0; }
posted on 2024-10-12 19:34 Jiejiejiang 阅读(32) 评论(0) 编辑 收藏 举报
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」