Codeforces Nebius Welcome Round (Div. 1 + Div. 2)
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();
}