【笔试训练】day3

简介: 【笔试训练】day3

1.简写单词

没思路

代码:
#include <iostream>
#include<string>
using namespace std;
 
int main() {
    string  str;
    string ans;
    getline(cin,str);
    if(str[0]>'Z')ans+=(str[0]-32);
    else ans+=str[0];
    for(int i=1;i<str.size();i++){
        if(str[i]!=' '&&str[i-1]==' '){
            if(str[i]>'Z')ans+=(str[i]-32);
            else ans+=str[i];
        }
    }
   cout<<ans;
 
    return 0;
}

2.dd爱框框

思路:

先维护一个前缀和s[].遍历每一个区间的左端点,去看看要想大于等于x 的最近右端点在哪。


由于区间和(正数)是具有单调性,这里可以用二分。对于每个可能的左端点,都二分查找一个符合条件的最近右端点。 这样我们就能把所有符合答案的情况求出来了,再用一个变量维护最小长度,这个长度最终是所有可能符合答案中的最小值。

注意题目要求输出答案区间,所以我们还需要维护一个左端点就行了,左端点加上答案长度就是答案的右端点。

写完之后发现双指针就可以了草。用两个指针维护一个区间的左右端点嘛,如果当前区间和小于x,那就右端点移动。否则左端点移动,缩小答案区间。

二分代码:
#include <iostream>
using namespace std;
typedef long long ll;
const int N=1e7+10;
ll s[N];
int main() {
    int n;
    int x;
    cin>>n>>x;
    for(int i=1;i<=n;i++){
       int k;
       cin>>k;
       s[i]=s[i-1]+k;
    }
    int ans=1e9;
    int star=1;
    for(int i=1;i<=n;i++){
        int l=i-1;
        int r=n+1;
        while(l+1!=r){
            int mid=(l+r)>>1;
            if(s[mid]-s[i-1]>=x)r=mid;//符合条件放在右边,最后右边的第一个就是最小的右端点
            else l=mid;
        }
        if(s[r]-s[i-1]>=x){
            if(r-i+1<ans){
                ans=r-i+1;
                star=i;
            }
        }
    }
    cout<<star<<" "<<star+ans-1;
    return 0;
}

双指针代码:

#include <iostream>
using namespace std;
typedef long long ll;
const int N=1e7+10;
int a[N];
int main() {
    int n;
    int x;
    cin>>n>>x;
    for(int i=1;i<=n;i++){
       cin>>a[i];
    }
    int ans=1e9;
    int star=1;
    ll sum=0;
    for(int i=1,j=1;i<=n;i++){
       sum+=a[i];
        while(sum>=x){
            if(i-j+1<ans){
                ans=i-j+1;
                star=j;
            }
            sum-=a[j];
            j++;
        }
    }
    cout<<star<<" "<<star+ans-1;
    return 0;
}

3.除2!

思路:

一眼看上去k很大,吓得我以为不能暴力了00

后来发现,一个int最大是2^32,即使这n个数都是一个最大的偶数,一共也最多被操作32*1e5

所以直接暴力枚举每次操作就行了。每次操作对最大的数除2,这样贡献才越大。用优先队列维护一下就行。

代码:
#include <iostream>
#include<queue>
using namespace std;
 
int main() {
    int n,k;
    cin>>n>>k;
    long long sum=0;//存总和
    priority_queue<int> q;
    while(n--){
        int x;
        cin>>x;
        sum+=x;
        if(x%2==0)q.push(x);//不是偶数直接滚
    }
 
    while(!q.empty()&&k){
       int it=q.top();
       q.pop();
       it/=2;
       sum-=it;
       k--;
       if(it%2==0)q.push(it);//不是偶数也没有再进去的必要了
    }
    cout<<sum;
    return 0;
}


相关文章
|
2月前
|
存储 编译器 C++
C++学习总结——初识C++
C++学习总结——初识C++
22 0
|
11月前
|
机器学习/深度学习 设计模式 算法
|
12月前
|
NoSQL Java jenkins
【学习总结】总结
【学习总结】总结
|
存储 Kubernetes 安全
k8s安全学习
k8s安全学习
309 0
|
存储 弹性计算 负载均衡
学习资料
个人记录学习资料
|
程序员 C++ C语言
C++这么难,为什么还要学习C++呢?如何学?
C++这么难,为什么还要学习C++呢?如何学?在大多数开发或者准开发人员的认识中,C/C++ 是一门非常难的编程语言,很多人知道它的强大,但因为认为“难”造成的恐惧让很多人放弃。 这个世界本来就是残酷的,所以你不能怪C++向你展示了世界的本质 大家都觉得很难等你攀登到高峰的时候发现,原来前面还有比这更高的山峰,等着你去继续攀登。
1445 0
|
存储 Shell API
鱼书学习小结(一)
1 安装环境 python -V #查看版本 pip -V #查看版本 pip list #查看列表 makedir fisher #新建项目目录 pip install pipenv #进入项...
|
前端开发 安全 Java
|
数据库 调度 数据库管理