Codeforces Nebius Welcome Round (Div. 1 + Div. 2)
A.Lame King
不難看出里就兩種操作向橫坐標(biāo)移動 向縱坐標(biāo)移動 如果橫坐標(biāo)每次移動中都穿插縱坐標(biāo)移動那么就不用休息 否則要休息
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
完完全全的貪心,我們在開藥時(shí)候讓開藥的時(shí)刻盡可能的往后就行了 那么st為開藥時(shí)間人w為人最大等待時(shí)間,d為藥的存放時(shí)間 a[i]就是第i個(gè)人的出現(xiàn)時(shí)間 那么假設(shè)在第i個(gè)人開藥
那么藥最晚時(shí)間就是 st=a[i]+w 那么有效時(shí)間就是ed=st+d 如果在這后續(xù)的人都<=ed
那么都可以一起用這包藥 最多用k個(gè)人 k個(gè)人后就需要重新開藥
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
我們想要從當(dāng)前點(diǎn)轉(zhuǎn)向0點(diǎn) 那么需要轉(zhuǎn)過的扇形至少為:((0-x)%n+n)%n ?而我們轉(zhuǎn)的時(shí)候
使用f的力 那么就轉(zhuǎn)1+2+3+4...+f圈,那么就是f的前綴和不難發(fā)現(xiàn)只要讓f的前綴和%n是((0-x)%n+n)%n即可 而前綴和%n是有規(guī)律的 其規(guī)律就是一個(gè)長度為2*n的重復(fù)序列 所以我們計(jì)算2*n的前綴和看看是否可以到達(dá)即可
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
每一行分開處理 當(dāng)有連續(xù)個(gè)1的時(shí)候兩廳戶和一廳戶的分配才會影響到答案 而兩廳戶比較特殊我們統(tǒng)計(jì)兩廳戶即可 最小的時(shí)候就讓兩廳戶 是兩個(gè)連續(xù)的1即可 不夠的就是補(bǔ)00或者01不會影響的 而最大的時(shí)候盡量不讓兩個(gè)連續(xù)的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();
}