C/C++每日一练3

发布时间:2026/7/21 13:10:11
C/C++每日一练3 1.简写单词题目规则输入一串空格分隔的英文单词取每个单词首字母转大写拼接输出示例 输入College English Test → 输出CET 输入I am Bob → 输出IABC 完整代码cpp运行#include iostream #include string using namespace std; int main() { string s; while (cin s) { char c s[0]; // 小写转大写 if (c a c z) c - 32; cout c; } return 0; }2.dd爱框框一、题意给定长度为n的正整数数组找长度最小的区间[l, r]满足区间和 ≥ x 多个同长度最小区间时输出左端点更小的一组 数组下标输出为从 1 开始。输入第一行n x\(1\le n\le 10^7,\ 1\le x\le 10000\)第二行n 个正整数 \(a_i \in [1,1000]\)示例输入plaintext10 20 1 1 6 10 9 3 3 5 3 7区间 3~5610925 ≥20长度 3是最短区间 输出3 5二、解题思路滑动窗口双指针 O (n)所有数字都是正数窗口和单调递增适合滑动窗口右指针不断向右扩大窗口累加和一旦窗口和 ≥ x不断收缩左边界同时更新最优区间记录最小长度长度相等则保留更早出现的区间。窗口初始收缩左边界缩小窗口#include iostream #include vector #include climits using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); // 加速输入处理千万级数据 int n, x; cin n x; vectorint a(n); for (int i 0; i n; i) cin a[i]; long long sum 0; int l 0, minLen INT_MAX; int ansL 0, ansR 0; for (int r 0; r n; r) { sum a[r]; // 当前窗口满足条件尽量左缩 while (sum x) { int curLen r - l 1; // 更短更新答案等长不更新保留左边更小的 if (curLen minLen) { minLen curLen; ansL l; ansR r; } sum - a[l]; } } // 题目下标从1开始 cout ansL 1 ansR 1 endl; return 0; }3.除2题目分析题意 给定长度为 n 的数组最多进行 k 次操作每次只能选偶数把它除以 2。 操作次数不超过 k求数组总和最小是多少。核心思路每次操作收益最大总和下降最多每次一定选当前最大的偶数除以 2这样总和减少最多使用大根堆优先队列维护数组循环最多 k 次取出堆顶最大数如果是奇数没法再除 2直接退出循环剩下操作全部浪费偶数除以 2放回堆消耗一次操作k 次用完或无偶数可操作时累加堆内所有数即为答案。C 完整代码cpp运行#include iostream #include queue #include vector using namespace std; int main() { int n, k; cin n k; priority_queueint heap; // 大根堆 for (int i 0; i n; i) { int x; cin x; heap.push(x); } while (k--) { int cur heap.top(); heap.pop(); if (cur % 2 ! 0) { // 奇数无法操作放回剩余操作无效 heap.push(cur); break; } cur / 2; heap.push(cur); } long long sum 0; while (!heap.empty()) { sum heap.top(); heap.pop(); } cout sum endl; return 0; }举例演示样例 1 输入plaintext3 3 8 4 2过程 k3取 8→4堆4,4,2k2取 4→2堆4,2,2k1取 4→2堆2,2,2k0 总和6样例 2plaintext2 5 5 16操作 16→8 (k4)→4 (k3)→2 (k2)→1 (k1)此时 1 是奇数剩余 1 次操作作废 数组5,1总和 6细节说明要用long long求和防止大数溢出遇到奇数直接终止循环后续操作没有意义贪心正确性每次削减最大偶数总和下降幅度最优。谢谢