【笔试训练】简单写词|dd爱框框|除2!
文章目录
- 1.简单写词
- 2.dd爱框框
- 3.除2!
1.简单写词
简单写词
思路:这道题思路非常简单,while(cin)循环输入每个单词,自动跳过空格,所以每次都只要判断单词的第一个字母是否是大写,如果是,则输出,如果是小写,则转成大写再输出即可。
#include <iostream>
#include <string>
using namespace std;int main() {//以空格作为分割符string s;while(cin >> s) //这里自动跳过空格,否则如果直接输入空格会直接停止。{if(s[0] >= 'a' && s[0] <= 'z')cout << (char)(s[0] - 'a' + 'A');else cout << s[0];}return 0;
}
2.dd爱框框
dd爱框框
思路:
这道题是一道典型的滑动窗口题目,只不过要注意一个细节问题:有效下标是从1开始的!!
这道题我一开始写的时候死活写不出来,看了题解才发现是下标问题。
滑动窗口四部曲:
- 1.进窗口
- 2.while/if判断要出窗口的条件
- 3.出窗口
- 4.更新结果(这个更新结果不一定是在最后一步进行,要看具体的题目,有可能是在任意位置更新结果)
//经典滑动窗口
//冯你个福的一开始写没注意到数组是从1开始的。
#include <iostream>
#include <vector>
using namespace std;int main()
{int n,x;cin >> n >> x;vector<int>arr(n+1,0);for(int i = 1;i <= n;i++)cin >> arr[i];int l = 1,r = 1;int sum = 0,len = 10000000;int flagl = 0;while(r <= n){//1.进窗口sum += arr[r];while(sum >= x) //2.判断{//每次都更新结果,保证len最小,且l最小。if(r-l+1 < len){flagl = l; //flagl就是最小的len = min(len,r - l + 1);}//出窗口sum -= arr[l++];}r++;}cout << flagl << " " << flagl + len - 1 << endl;return 0;
}
3.除2!
除2!
思路:
1.搞一个大根堆,一遍输入一边判断如果输入的元素为偶数,则进堆(奇数不进堆)
2.每次都取出堆顶元素(取了最大的偶数),进行/2操作,然后再判断/2后是否还是偶数,是的话再次进堆
3.循环进行,直到堆为空||操作了k次。
4.返回所有操作后的值即可。
#include <iostream>
#include <queue>using namespace std;int main()
{int n,k;cin >> n >> k;priority_queue<long long> heap;int i = 0;long long sum = 0; //统计所有被操作过和没被操作过的元素和while(i < n){long long a;cin >> a;sum += a;if(a % 2 == 0)heap.push(a);i++;}while(heap.size() && k--){long long t = heap.top();heap.pop();t /= 2;sum -= t; //该语句位置一定要放对if(t % 2 == 0)heap.push(t);}cout << sum << endl;return 0;
}