随笔 - 72,  文章 - 2,  评论 - 0,  阅读 - 1258

E. Hostel Cleaning

题意:一个圆桌子,n个人,每个位置的打扫成本是a[i],一给清洁工可以打扫连续的k个位置,k一定是n的因子,问最少需要多少成本

思路:因为k一定是n的因子,所以有起始位置是1到k,k种情况,因为k小,那n/k,就大,如果k大,n/k就小,因此就时间复杂度位n

代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    ll n,k,a[2000006];
    int main(){
        cin>>n>>k;
        ll sum=1e18;
        for (ll i = 1; i <=n ; ++i) {
            cin>>a[i];
        }
        for (ll i = 1; i <=k ; ++i) {
            ll s=0;
            for (ll j = i; j <=n ; j+=k) {
                s+=a[j];
            }
            sum=min(s,sum);
        }
        cout<<sum;
    }

H. Perfect Array

题意:数组A是由1到i的数插入得到的,比如1 2 1 是先插入一个 1,再插入一个1,再插入一个2,是否可以形成数组A,并输入依次插入的数

思路:从后往前遍历A,若a[i]==i+1,则推入数组ans,删除a[i],依次寻早n个这样的数,输出数组ans

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,INF=1e9,M=1e3+10;
int n;
vector<int> ve,ans;
int main(){
    cin>>n;
    int x;
    for(int i=0;i<n;++i){
        cin>>x;
        ve.push_back(x);
    }
    vector<int>c;
    while(ans.size()!=n){
        c.clear();
        bool ok=false;
        for(int i=ve.size()-1;i>=0;--i){
            if(!ok&&ve[i]==i+1){
                ans.insert(ans.begin(),ve[i]);ok=true;
                continue;
            }
            c.insert(c.begin(),ve[i]);
        }
        if(c.size()==ve.size()){
            cout<<"NO";
            return 0;
        }
        ve.clear();
        ve=c;
    }
    cout<<"YES\n";
    for(auto t:ans)cout<<t<<' ';
    return 0;
}
posted on   IR101  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示