Educational Codeforces Round 122 (Rated for Div. 2) A B C D
A Div. 7
思路: 能被$7$整除,方法有很多种,因为要求最小次数,那么我们特判能被$7$整除就输出$0$否则,暴力最后一位能被$7$整除即可,然后返回$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)$扫一遍,$0$和$1$的数量相等就$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$的值,后来发现$all$ $k$ 不超过$2e5$,果断暴力。前缀知识上取整写法即可。$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;//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
思路: 感觉对我有营养的题。$dp01$背包的运用,对数据范围的敏感。我做题的时候是比较容易得到将$b$数组全部替换成$i->b[i]$需要的$step$。然后发现是$01$背包的写法,选或不选。然而直接暴力$01$背包的话时间复杂度是$O(nk)$为$1e9$级别,因为对数据不是那么敏感,在后来才发现由于$n$的数据是$1e3$级别,那么变化$step$是$12$次左右最多。那么我们可以将$k$的范围缩小为$min(k,n*12)$,那么再跑背包的话时间复杂度就降到$1e7$级别可以接受。$step$可以通过预处理$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];//有清空的上一次solve的效果了。
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;
}
总结:
这一场$ab$属于签到,$c$需要一点思维$+$推公式。$d$是在裸的基础上加一点点数据敏感的$01$背包。$e$是$rating2400$的题,$f$是$2800$的题对我来说暂不可补。
snow越来越厉害了🥳🥳!
新年后的康复训练vp呜