1.29.2024-2.4.2024(SMU Winter 2024 the second week)

前缀和

牛客-按闹分配

C-按闹分配_2024牛客寒假算法基础集训营1 (nowcoder.com)

#include<bits/stdc++.h>
using namespace std;
#define ll long long

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,Q,tc;
    cin>>n>>Q>>tc;
    vector<ll> per(n),sum(n+1);
    for(int i=0;i<n;i++){
        cin>>per[i];
    }
    sort(per.begin(),per.end());
    for(int i=1;i<=n;i++){
        sum[i]=per[i-1]+sum[i-1];
    }
    while(Q--){
        ll M;
        cin>>M;
        ll x;
        x=M/tc;
        if(x>=n) {cout<<tc<<endl; continue;}
        if(x==0) {cout<<tc+sum[n]<<endl; continue;}
        else {cout<<sum[n-x]+tc<<endl; continue;}
    }
    return 0;
}

用前缀和使最终运算更为简便,但while(Q--)里的代码单独写成solve()再在while调用就会TLE(相当糟心),作为日后TLE后的一种考量。

给一个数组,问你可以求出多少个总和为77777777的子区间

#include<bits/stdc++.h>
using namespace std;
int main() {

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int T;
    cin >> T;
    while(T--) {
        int n;
        cin >> n;
        vector<int> a(n);
        for(int i=0;i<n;i++) {
            cin>>a[i];
        }
        unordered_map<int,int> sc;
        int sum=0;
        int count=0;
        sc[0]=1;
        for(int i=0;i<n;i++) {
            sum+=a[i];
            if(sc.count(sum-7777)) {
                count+=sc[sum-7777];
            }
            sc[sum]++;
        }
        cout<<count<<endl;
    }
    return 0;
}

sort降序

G-why买外卖_2024牛客寒假算法基础集训营1 (nowcoder.com)

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e5+10;
ll n,m,T;
ll x;
pair<int,int> p[N];

bool cmp(pair<int,int>a,pair<int,int>b){
    return a.first>b.first;
}//sort降序

int main(){
    ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>T;
    while(T--){
        int cnt=1;
        cin>>n>>m;
        for(int i=0;i<n;i++){
            int a,b;
            cin>>a>>b;
            if(a>b){
                p[cnt].first=a;
                p[cnt].second=b;
                cnt++;
            }
            else{
                m+=b;
            }
        }
        sort(p+1,p+cnt,cmp);//sort降序
        ll sum=0;
        for(int i=1;i<cnt;i++){
            sum+=p[i].second;
            //cout<<sum<<" $$ ";
        }
        bool flag=0;
        for(int i=1;i<cnt;i++){
            if(m>=p[i].first-sum){
                x=m+sum;
                flag=1;
                break;
            }
            else{
                sum-=p[i].second;
            }
        }
        if(flag==1) cout<<x<<endl;
        else cout<<m<<endl;
    }
    return 0;
}

string按空格拆开,指定位置读出,删除

Problem - M - Codeforces

#include<bits/stdc++.h>
using namespace std;
int main() {
    int T;
    cin>>T;
    getchar();
    while(T--){

    string str;
    getline(cin,str);//按行读入

    int lenth=str.size();
    char c=str.at(lenth-1);//c等于str的lenth-1号字符(最后一个

    str.pop_back();//删除str的最后一个字符

    vector<string> v1;
    vector<string> v2;
    istringstream in(str);//用于按空格拆string

    string t; int cou=0;
    while(in>>t){
        v1.push_back(t);
        cou++;
    }//按空格拆开str,再分开存入v1
    v2=v1;
    reverse(v2.begin(),v2.end());

    int ans=0;
    for(int i=0;1;i++){
      cout<<v1[i]; ans++; if(ans==cou) break; else cout<<" ";
       cout<<v2[i]; ans++; if(ans==cou) break;   else cout<<" ";
    }
    cout<<c<<endl;

    }
    return 0;
}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值