赛后不补题,相当于白打。
在第一个和第n个位置必须要为1,所以可以保证满足条件的最小条件为ceil(n-1/k)+1
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int>
#define vi vector<int>
vector<int> a[200010];
void solve()
{
int n,k;
cin>>n>>k;
int m=ceil(double(1.0*(n-1)/k));
cout<<m+1<<endl;
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}
B - Lamps
这题前提条件是ai要小于等于开启灯泡的数量。又因为文中提到已经开启的灯泡坏掉也算分,
所以,每次可以保证ai 的灯泡最多可以开ai个。因为再多就会坏掉,无法再开启。
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int>
#define vi vector<int>
vector<int> a[200010];
void solve()
{
int n;
cin>>n;
for (int i=1;i<=n;i++){
a[i].clear();
}
for (int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
a[x].push_back(y);
}
for (int i=1;i<=n;i++){
sort(all(a[i]),greater());
}
int sum=0;
for (int i=1;i<=n;i++){
for (int j=0;j<(int)a[i].size() && j<i;j++){
sum+=a[i][j];
}
}
cout<<sum<<endl;
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}
C - Insert Zero and Invert Prefix
这题是一个构造体。通过分析题目我们可以得出在1的后面必须要有0.否则无法得到1
在根据样例1 : 1 1 0 0 0 来分析。
我们可以先得到4个0 ,再在第二个位置插入0. 所以我们可以从后向前遍历,如果为0 直接输出0,否则计算连续1的数量并输出。
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define IOS ios::sync_with_stdio(0),cin.tie(0);
#define all(x) x.begin(),x.end()
#define pi pair<int,int>
#define vi vector<int>
void solve()
{
int n;
cin>>n;
vi a(n+1);
vi b;
for (int i=1;i<=n;i++){
cin>>a[i];
}
if(a[n]==0){
cout<<"Yes"<<endl;
for (int i=n;i>=1;i--){
if(a[i]==0){
b.push_back(0);
}
else if (a[i]==1){
int cnt=0;
while(a[i]==1){
i--;
cnt++;
}
i++;
for (int j=1;j<=cnt-1;j++){
b.push_back(0);
}
b.push_back(cnt);
}
}
for (int i=0;i<=n-1;i++){
cout<<b[i]<<" ";
}
cout<<endl;
}
else {
cout<<"No"<<endl;
}
}
signed main()
{
IOS
int t;
cin>>t;
while(t--){
solve();
}
}