欢迎光临散文网 会员登陆 & 注册

Codeforces Nebius Welcome Round (Div. 1 + Div. 2)

2023-03-13 12:59 作者:zero_xzp  | 我要投稿

A.Lame King

不难看出里就两种操作向横坐标移动 向纵坐标移动 如果横坐标每次移动中都穿插纵坐标移动那么就不用休息 否则要休息

Code:

#include<bits/stdc++.h>

using namespace std;

#define endl '\n'

#define ff first

#define ss second

typedef long long ll;

typedef pair<int,int>PII;

typedef vector<int>VI;

const int N=1e5+10;

ll n,m,t;

void solve(){

ll x,y;

cin>>x>>y;

x=abs(x),y=abs(y);

ll ans=x+y,tt=abs(x-y);

ans=ans+max(tt-1,0ll);

cout<<ans<<endl;

}

int main(){

ios::sync_with_stdio(false);

cin.tie(0);

cout.tie(0);

cin>>t;

while(t--)solve();

}


B. Vaccination

完完全全的贪心,我们在开药时候让开药的时刻尽可能的往后就行了 那么st为开药时间人w为人最大等待时间,d为药的存放时间 a[i]就是第i个人的出现时间 那么假设在第i个人开药

那么药最晚时间就是 st=a[i]+w 那么有效时间就是ed=st+d 如果在这后续的人都<=ed

那么都可以一起用这包药 最多用k个人 k个人后就需要重新开药

Code:

#include<bits/stdc++.h>

using namespace std;

#define endl '\n'

#define ff first

#define ss second

typedef long long ll;

typedef pair<int,int>PII;

typedef vector<int>VI;

const int N=1e5+10;

ll n,m,t,k,d,w;

void solve(){

cin>>n>>k>>d>>w;

vector<int>a(n+1);

for(int i=1;i<=n;i++)cin>>a[i];

int ans=0,st=a[1]+w,ed=st+d,s=1;

for(int i=2;i<=n;i++){

if(a[i]<=ed&&s<k)s++;

else{

ans++;

st=a[i]+w,ed=st+d;

s=1;

}

}

ans++;

cout<<ans<<endl;

}

int main(){

ios::sync_with_stdio(false);

cin.tie(0);

cout.tie(0);

cin>>t;

while(t--)solve();

}

C. Pull Your Luck

我们想要从当前点转向0点 那么需要转过的扇形至少为:((0-x)%n+n)%n  而我们转的时候

使用f的力 那么就转1+2+3+4...+f圈,那么就是f的前缀和不难发现只要让f的前缀和%n是((0-x)%n+n)%n即可 而前缀和%n是有规律的 其规律就是一个长度为2*n的重复序列 所以我们计算2*n的前缀和看看是否可以到达即可

Code:

#include<bits/stdc++.h>

using namespace std;

#define endl '\n'

#define ff first

#define ss second

typedef long long ll;

typedef pair<int,int>PII;

typedef vector<int>VI;

const int N=2e5+10;

ll n,m,t,x,p;

ll f[N];

void solve(){

cin>>n>>x>>p;

int ans=((0-x)+n)%n;

// cout<<ans<<endl;

for(int i=1;i<=min(2*n,p);i++){

f[i]=(f[i-1]+(i%n))%n;

if(f[i]==ans){

cout<<"YES\n";

return ;

}

}

cout<<"NO\n";

}

int main(){

ios::sync_with_stdio(false);

cin.tie(0);

cout.tie(0);

cin>>t;

while(t--)solve();

}

D. Accommodation

每一行分开处理 当有连续个1的时候两厅户和一厅户的分配才会影响到答案 而两厅户比较特殊我们统计两厅户即可 最小的时候就让两厅户 是两个连续的1即可 不够的就是补00或者01不会影响的 而最大的时候尽量不让两个连续的11为两厅户 这而不够的只能是11了

Code:

#include<bits/stdc++.h>

using namespace std;

#define endl '\n'

#define ff first

#define ss second

typedef long long ll;

typedef pair<int,int>PII;

typedef vector<int>VI;

const int N=5e5+10;

ll n,m,t,x,p;

char s[N];

void solve(){

cin>>n>>m;

int sig=m/2,dou=m/4,sum=m/2+m/4;

int ma=0,mi=0;

for(int i=1;i<=n;i++){

cin>>s;

int cnt=0;

for(int j=0;j<m;j++){

if(s[j]=='1')cnt++;

}

int cut=0,dut=0;

for(int j=0;j<m-1;j++){

if(s[j]=='1'&&s[j+1]=='1'){

cut++;

j++;

}

}

for(int j=0;j<m-1;j++){

if(!(s[j]=='1'&&s[j+1]=='1')){

dut++;

j++;

}

}

mi=mi+cnt-min(cut,dou);

ma=ma+cnt-dou+min(dut,dou);

}

cout<<mi<<" "<<ma<<endl;

}

int main(){

ios::sync_with_stdio(false);

cin.tie(0);

cout.tie(0);

//cin>>t;

t=1;

while(t--)solve();

}



Codeforces Nebius Welcome Round (Div. 1 + Div. 2)的评论 (共 条)

分享到微博请遵守国家法律