Hello 2023

题目链接

1|0A

核心思路:简单的结论题就是需要RL就可以了。

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N = 3e3 + 10,INF=0x3f3f3f3f; int n, ans = -INF; int a[N]; void solve() { int len; cin >> len; string s; cin >> s; int ans = -1; int flag = 0; for (int i = 0;i < len;i++) { if (s[i] == 'L' && s[i + 1] == 'R') { ans = i; break; } if (s[i] == 'R' && s[i + 1] == 'L') { flag = 1; break; } } if (flag == 1) { cout << 0 << endl; return ; } else if (flag == 1 && ans != -1) { cout << ans + 1 << endl; return; } else if (flag == 0 && ans != -1) { cout << ans + 1 << endl; return; } else if (flag == 0 && ans == -1) { cout << -1<<endl; return; } } int main() { int T; cin >> T; while (T--) { solve(); } }

2|0B

核心思路:这是一道很好的构造题。也就是一个列方程组的过程 ,首先模拟n=3然后就是n=5的情况。我们会发现一个规律。

t bt t bt t bt ....

所以我们只需要列方程组解出来b就好了。所以还是得一步一步来,如果看不出规律的话。设参一定要注意不要搞糊涂了。一步一步来就不会错。

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N = 3e3 + 10,INF=0x3f3f3f3f; int n, ans = -INF; int a[N]; void solve() { int n; cin >> n; if (n % 2) { if (n == 3) { cout << "NO" << endl; return; } else { cout << "YES" << endl; int m = ceil((double)n / 2.0); int a = 1+m-n; double b = (m - 1); for (int i = 1;i <= n - 1;i++) { if (i & 1) cout << a << " "; else cout << b << " "; } cout << a << endl; } } else { int flag = 1; cout << "YES" << endl; for (int i = 1;i <= n;i++) { cout << flag << " "; flag = -flag; } cout << endl; } } int main() { int T; cin >> T; while (T--) { solve(); } }

3|0C

核心思路:首先我们观察题目,看能不能抽象为数学模型和图形模型。我们首先假设sum[L,R]=a[L]+a[L+1]+a[L+2]+....+a[R].

然后我们分类讨论:

  • k<=m
    • a[1,k]a[1,m]a[k+1,m]0
    • 因为k1,i[2,m],a[i,m]0
  • k>m
    • a[1,k]a[1,m]a[m+1,k]0
    • 所以可以得到对于任意的i属于[m+1,n],都存在a[m+1,i]0

推到了这个关键的式子整个问题就迎刃而解了,所以我们需要建立合适的数学模型。

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N = 3e6 + 10,INF=0x3f3f3f3f; int n,m, ans = -INF; LL a[N]; void solve() { cin >> n >> m; for (int i = 1; i <= n; i++)cin >> a[i]; LL sum = 0; multiset<int>st; int ans = 0; for (int i = m + 1; i <= n; i++) { // [m + 1,i] sum += a[i]; st.insert(a[i]); if (sum < 0) {//我们希望大于 0 如果有小于0的地方,就给最小的一个添加上负号 int mi = *st.begin(); sum -= 2 * mi; ans++; st.erase(st.begin()); } } st.clear(); sum = 0; for (int i = m; i >= 2; i--) { //[i,m] sum += a[i]; st.insert(a[i]); if (sum > 0) { int mx = *prev(st.end()); sum -= 2 * mx; ans++; st.erase(prev(st.end())); } } cout << ans << endl; } int main() { int T; cin >> T; while (T--) { solve(); } }

4|0D

核心思路:我们首先想什么情况下可以共用刀片呢,首先我们不可以砍去我们不该砍去的部分。所以我们可以使用st表来求RMQ.来判断是否是否可以共用,可以共用的话那么我们就可以省一个刀片。

所以接下来就是一个大模拟了,我们做模拟题其实可以先写题解,在写代码。

#define _CRT_SECURE_NO_WARNINGS #include<iostream> #include<cstring> #include<algorithm> #include<vector> #include<bits/stdc++.h> using namespace std; typedef long long LL; const int N = 2e5 + 10,INF=0x3f3f3f3f; int f[N][21],a[N],b[N]; int n,m; void build() { for (int i = 1;i <= n;i++) f[i][0] = b[i]; for (int i = 1;i <= 21;i++) { for (int j = 1;j + (1 << i) - 1 <= n;j++) { f[j][i] = max(f[j][i - 1], f[j + (1 << (i-1))][i - 1]); } } } int query(int l, int r) { int k = log2(r - l + 1); return max(f[l][k], f[r - (1 << k) + 1][k]); } void solve() { cin >> n; for (int i = 1;i <= n;i++) cin >> a[i]; for (int i = 1;i <= n;i++) cin >> b[i]; cin >> m; map<int, int> cnt; for (int i = 1;i <= m;i++) { int X; cin >> X; cnt[X]++; } build(); for (int i = 1;i <= n;i++) { if (a[i] < b[i]) { cout << "NO" << endl; return; } } map<int, vector<int>> mp; for (int i = 1;i <= n;i++) { mp[b[i]].push_back(i); } for (auto p : mp) { int val = p.first; vector<int>& pos = p.second; vector<int> cut; for (auto i : pos) { if (a[i] != b[i]) cut.push_back(i); } int need_cut = cut.size(); for (int i = 1;i < cut.size();i++) { int L = cut[i - 1]; int R = cut[i]; if (query(L, R) <= val)//可以共用刀片的前提下是需要那个区间的需要小于等于我们的刀片,不然就把那些不需要切除的给切了。 { need_cut--; } } if (need_cut > cnt[val])//这里用到了cnt { cout << "NO" << endl; return; } } cout << "YES" << endl; } int main() { int T; cin >> T; while (T--) { solve(); } }

__EOF__

本文作者肖英豪
本文链接https://www.cnblogs.com/xyh-hnust666/p/17028810.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   努力的德华  阅读(70)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· Apache Tomcat RCE漏洞复现(CVE-2025-24813)
点击右上角即可分享
微信分享提示