Educational Codeforces Round 86 Rated for Div. 2
A. Road To Zero(水)
题意:给定x,y。
- 操作一:花费a,对x、y其中一个加/减1
- 操作二:花费b,同时对x、y同时加/减1
问最小花费
思路:三种情况,取最小值
int n;
int main(){
int t,tt,f1=0;
LL x,a,b,y,ans;
t=ird();
while(t--){
x=lrd();y=lrd();a=lrd();b=lrd();
ans=(x+y)*a;
ans=min(ans,min(x,y)*b+a*(max(x,y)-min(x,y)));
ans=min(ans,max(x,y)*a+b*(max(x,y-min(x,y))));
cout<<ans<<endl;
}
}
B. Binary Period
题意:给定字符串 t t t,输出字符串 s s s( ∣ s ∣ |s| ∣s∣长度小于等于 2 ⋅ ∣ t ∣ 2·|t| 2⋅∣t∣),使得 s s s中的周期最小。
思路:判断 t t t中是否同时有 0 、 1 0、1 0、1
- 如果单一,最小周期为 1 1 1:直接输出
- 如果同时有 0 、 1 0、1 0、1,最小周期为 2 2 2:输出 01 01 01间隔串
int n;
int main(){
int t,tt,f1=0,f0=0,len;
LL x,a,b,y,ans;
cin>>t;
string s;
while(t--){
cin>>s;
f1=0;f0=0;
len=s.length();
for(int i=0;i<len;i++){
if(s[i]-'0')f1++;
else f0++;
}
if(f1==0){
for(int i=1;i<=len;i++)
cout<<"0";
cout<<endl;
continue;
}
if(f0==0){
for(int i=1;i<=len;i++)
cout<<"1";
cout<<endl;
continue;
}
if(s[0]=='0'){
for(int i=0;i<len;i++){
cout<<"01";
}
cout<<endl;
continue;
}
if(s[0]=='1'){
for(int i=0;i<len;i++){
cout<<"10";
}
cout<<endl;
continue;
}
}
}
C. Yet Another Counting Problem
题意:
t
t
t次测试,每次测试给定
a
、
b
、
q
a、b、q
a、b、q
接下来
q
q
q次询问,给定
l
i
,
r
i
l_i,r_i
li,ri,问在
[
l
i
,
r
i
]
[l_i,r_i]
[li,ri]区间范围内,使得
(
(
x
m
o
d
a
)
m
o
d
b
)
≠
(
(
x
m
o
d
b
)
m
o
d
a
)
((x \bmod a)\bmod b)\ne ((x \bmod b)\bmod a)
((xmoda)modb)=((xmodb)moda)的数字x个数
思路:
找规律(
a
<
b
a<b
a<b)
每个使得
(
(
x
m
o
d
a
)
m
o
d
b
)
=
(
(
x
m
o
d
b
)
m
o
d
a
)
((x \bmod a)\bmod b)=((x \bmod b)\bmod a)
((xmoda)modb)=((xmodb)moda)成立的范围为
[
1
,
b
−
1
]
,
[
l
c
m
(
a
,
b
)
,
l
c
m
(
a
,
b
)
+
b
−
1
]
[1,b-1],[lcm(a,b),lcm(a,b)+b-1]
[1,b−1],[lcm(a,b),lcm(a,b)+b−1]
把
r
i
−
l
i
+
1
r_i-l_i+1
ri−li+1个数字减去成立的个数:
[
1
,
r
i
i
]
[1,r_ii]
[1,rii]中成立的个数
c
o
co
co减去
[
1
,
l
i
−
1
]
[1,l_i-1]
[1,li−1]中成立的个数
p
r
pr
pr。
int n;
/*int main(){///找规律部分
LL l,a=7ll,b=14ll,r,ans;
for(int i=1;i<=200;i++){
if((i%a)%b==(i%b)%a)
cout<<i<<" ";
}
return 0;
}*/
LL ans[maxn];
int main(){
int t,f1=0,f0=0,len,q;
LL l,a,b,r,tt,co,pr,minn,maxx;
t=ird();
while(t--){
a=lrd();b=lrd();q=ird();
tt=llcm(a,b);
if(a>b)swap(a,b);
if(a==b||b%a==0){
for(int i=1;i<=q;i++){l=lrd();r=lrd();}
for(int i=1;i<=q;i++)
cout<<0<<" ";
cout<<endl;
continue;
}
for(int i=1;i<=q;i++){
l=lrd();r=lrd();
co=r/tt*b;
if(r<r/tt*tt+b-1&&co){co-=r/tt*tt+b-1-r;}
pr=(l-1)/tt*b;
if((l-1)<(l-1)/tt*tt+b-1&&pr){pr-=(l-1)/tt*tt+b-1-l+1;}
co-=pr;
ans[i]=r-l+1-co;
minn=min(r,b-1ll);
maxx=max(l,1ll);
if(minn>=maxx)ans[i]-=minn-maxx+1;
}
for(int i=1;i<=q;i++)
cout<<ans[i]<<" ";
cout<<endl;
}
}
D. Multiple Testcases
CF 1342D
气死我了我就差一个ceil我的天wsm老这样我吐了我好难过555555555555
题意:
给定
n
、
k
n、k
n、k,给定
n
n
n个数组
m
i
m_i
mi,要求将其分组。
给定
k
k
k大小的数组
c
i
c_i
ci,要求每个组中大于等于
i
i
i的数字个数小于等于
c
i
c_i
ci。
求最小分组数anss,并输出每个分组内分配的数字。
思路:
一开始想的已经差不多了,就差一个ceil
先求出最小分组数anss:对
m
m
m数组排序,
d
p
i
dp_i
dpi记录大于等于
i
i
i的数字个数,当前的anss就是
c
e
i
l
(
d
p
i
/
c
i
)
ceil(dp_i/c_i)
ceil(dpi/ci),对anss取最大值
int n;
vector<LL> ans[maxn];
LL m[maxn],c[maxn],dp[maxn],mp[maxn],anss;
int main(){
LL n=lrd(),k=lrd();
anss=0;
for(int i=1;i<=n;i++){m[i]=lrd();mp[m[i]]++;}
sort(m+1,m+1+n);
for(int i=k;i>=1;i--)dp[i]=dp[i+1]+mp[i];
for(int i=1;i<=k;i++){c[i]=ird();anss=max(anss,(dp[i]+c[i]-1)/c[i]);}
cout<<anss<<endl;
int nw=0;
for(int i=n;i>=1;i--){
ans[nw].push_back(m[i]);
nw++;
nw%=anss;
}
for(int i=0;i<anss;i++){
cout<<ans[i].size()<<" ";
for(int j=0;j<ans[i].size();j++)
cout<<ans[i][j]<<" ";
cout<<endl;
}
}