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 2023-02-12 17:39  IR101  阅读(4)  评论(0编辑  收藏  举报  来源