题意:一个圆桌子,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;
}
题意:数组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;
}