Educational Codeforces Round 122 (Rated for Div. 2) A B C D
A Div. 7
思路: 能被
7
7
7整除,方法有很多种,因为要求最小次数,那么我们特判能被
7
7
7整除就输出
0
0
0否则,暴力最后一位能被
7
7
7整除即可,然后返回
1
1
1,必定有答案。
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define int long long
#define re register int
#define pb emplace_back
#define lowbit(x) (x&-x)
#define fer(i,a,b) for(re i = a ; i <= b ; i ++)
#define der(i,a,b) for(re i = a ; i >= b ; i --)
#define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a*b/gcd(a,b);}
typedef pair<int,int>PII;
typedef pair<int,string>PIS;
void solve(){
int n;
cin>>n;
if(n%7==0){
cout<<n<<endl;return;
}
int x=n/10;
for(int i=0;i<=9;i++){
if((x*10+i)%7==0){
cout<<(x*10+i)<<endl;
return ;
}
}
}
signed main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
B Minority
思路: 大水题,
O
(
n
)
O(n)
O(n)扫一遍,
0
0
0和
1
1
1的数量相等就
c
o
n
t
i
n
u
e
continue
continue,否则更新目标值。
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define int long long
#define re register int
#define pb emplace_back
#define lowbit(x) (x&-x)
#define fer(i,a,b) for(re i = a ; i <= b ; i ++)
#define der(i,a,b) for(re i = a ; i >= b ; i --)
#define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a*b/gcd(a,b);}
typedef pair<int,int>PII;
typedef pair<int,string>PIS;
void solve(){
string s;
cin>>s;
int cnt1=0,cnt2=0;
int ma=0;
for(int i=0;i<s.size();i++){
if(s[i]=='0')cnt1++;
else cnt2++;
if(cnt1==cnt2)continue;
ma=max(ma,min(cnt1,cnt2));
}
cout<<ma<<endl;
}
signed main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
C Kill the Monster
思路: 想歪了,一开始以为二分
k
k
k的值,后来发现
a
l
l
all
all
k
k
k 不超过
2
e
5
2e5
2e5,果断暴力。前缀知识上取整写法即可。
O
(
k
)
O(k)
O(k)扫描。需要推出角色攻击次数要小于等于怪物攻击次数。
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define int long long
#define re register int
#define pb emplace_back
#define lowbit(x) (x&-x)
#define fer(i,a,b) for(re i = a ; i <= b ; i ++)
#define der(i,a,b) for(re i = a ; i >= b ; i --)
#define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a*b/gcd(a,b);}
typedef pair<int,int>PII;
typedef pair<int,string>PIS;
void solve(){
int a,b,c,d;
cin>>a>>b>>c>>d;
int k,a1,b1;
cin>>k>>b1>>a1;
int cnt1,cnt2;
cnt1=(a+d-1)/d;
cnt2=(c+b-1)/b;
if(cnt2<=cnt1){
cout<<"YES"<<endl;
return ;
}
for(int i=0;i<=k;i++){
int a2,b2;
a2=a+i*a1;
b2=b+(k-i)*b1;
cnt1=(a2+d-1)/d;
cnt2=(c+b2-1)/b2;
if(cnt1>=cnt2){
cout<<"YES"<<endl;
return ;
}
}
cout<<"NO"<<endl;
}
signed main(){
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
D Make Them Equal
思路: 感觉对我有营养的题。
d
p
01
dp01
dp01背包的运用,对数据范围的敏感。我做题的时候是比较容易得到将
b
b
b数组全部替换成
i
?
>
b
[
i
]
i->b[i]
i?>b[i]需要的
s
t
e
p
step
step。然后发现是
01
01
01背包的写法,选或不选。然而直接暴力
01
01
01背包的话时间复杂度是
O
(
n
k
)
O(nk)
O(nk)为
1
e
9
1e9
1e9级别,因为对数据不是那么敏感,在后来才发现由于
n
n
n的数据是
1
e
3
1e3
1e3级别,那么变化
s
t
e
p
step
step是
12
12
12次左右最多。那么我们可以将
k
k
k的范围缩小为
m
i
n
(
k
,
n
?
12
)
min(k,n*12)
min(k,n?12),那么再跑背包的话时间复杂度就降到
1
e
7
1e7
1e7级别可以接受。
s
t
e
p
step
step可以通过预处理
i
n
i
t
(
)
init()
init()实现。
#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define int long long
#define re register int
#define pb emplace_back
#define lowbit(x) (x&-x)
#define fer(i,a,b) for(re i = a ; i <= b ; i ++)
#define der(i,a,b) for(re i = a ; i >= b ; i --)
#define snow ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int gcd(int a,int b){return b?gcd(b,a%b):a;}
int lcm(int a,int b){return a*b/gcd(a,b);}
typedef pair<int,int>PII;
typedef pair<int,string>PIS;
const int N=1010,M=N*12;
int b[N];
int c[N];
int f[N][M];
int dist[N];
void init(){
memset(dist,0x3f,sizeof dist);
dist[1]=0;
for(int i=1;i<N;i++){
for(int j=1;j<=i;j++){
int x=i+i/j;
if(x>=N)continue;
dist[x]=min(dist[x],dist[i]+1);
}
}
}
void solve(){
int n,k;
cin>>n>>k;
k=min(n*12,k);
for(int i=1;i<=n;i++){cin>>b[i];b[i]=dist[b[i]];}
for(int i=1;i<=n;i++)cin>>c[i];
int m=k;
for(int i=1;i<=n;i++){
for(int j=0;j<=m;j++){
f[i][j]=f[i-1][j];
if(j>=b[i]){
f[i][j]=max(f[i][j],f[i-1][j-b[i]]+c[i]);
}
}
}
cout<<f[n][m]<<endl;
}
signed main(){
int t;
cin>>t;
init();
while(t--){
solve();
}
return 0;
}
总结:
这一场
a
b
ab
ab属于签到,
c
c
c需要一点思维
+
+
+推公式。
d
d
d是在裸的基础上加一点点数据敏感的
01
01
01背包。
e
e
e是
r
a
t
i
n
g
2400
rating2400
rating2400的题,
f
f
f是
2800
2800
2800的题对我来说暂不可补。
|