Educational Codeforces Round 122 (Rated for Div. 2) A-D题解

这篇博客探讨了三个编程问题,涉及数学规律、字符串处理和策略优化。A题中,寻找n的两位数形式,使得其除以7余数为0;B题通过比较0和1的数量来确定字符串修改次数;C题则考虑在有限次操作下能否战胜怪物,D题通过01背包解决在限制操作次数内使数组元素相等的问题。
摘要由CSDN通过智能技术生成

A. Div. 7

思路
注 意 n > = 10 , 说 明 一 定 是 两 位 数 注意n>=10,说明一定是两位数 n>=10
并 且 7 个 一 循 环 , 直 接 枚 举 这 位 数 的 最 后 一 位 并且7个一循环,直接枚举这位数的最后一位 7
暴 力 判 断 是 否 可 行 即 可 暴力判断是否可行即可
时间复杂度 O t Ot Ot

#include <bits/stdc++.h>
#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 cf int _; cin>> _; while(_--)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int> 
#define re register int
#define lb lower_bound
#define ub upper_bound
#define int long long 
#define pb push_back
#define y second 
#define x first 
using namespace std;
inline void sf2(int &a , int &b) { sf(a) , sf(b) ;}
inline void sf3(int n , int a[]) {fer(i,1,n) sf(a[i]);} ;
inline void de(auto x) {cout << x << "\n" ;}
inline void de2(auto a , auto b) {cout << a << " " << b << "\n" ;}
inline void de3(int n , auto a[]){fer(i,1,n) cout << a[i] << " " ;puts("");}
inline void mo(int &a , int b) {a = (a % b + b) % b ;}
inline int gcd(int a,int b){return b ? gcd(b , a % b) : a ;}
inline int qpow(int a,int b,int c){int res=1%c;a%=c;while(b>0){if(b&1)res=res*a%c;a=a*a%c;b>>=1;}return res;}
inline int qadd(int a,int b,int c){int res=0;a%=c;while(b>0){if(b&1)res=(res+a)%c;a=(a+a)%c;b>>=1;}return res;} 
const int inf = 0x3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f ;
const int N = 1e6 + 10 , M = 3010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;
 
signed main()
{
    cf
    {
        int n ;
        cin >> n ;
        if(n % 7 == 0) de(n) ;
        else
        {
            string s = to_string(n) ;
            
            for(char i = '0' ; i <= '9' ; i ++)
            {
                s[sz(s) - 1] = i ;
                if(stoi(s) % 7 == 0)
                {
                    de(s) ;
                    break ;
                }
            }
        }
    }
    return 0;
}

B. Minority

思路
假 设 该 字 符 串 0 的 数 量 为 a 假设该字符串0的数量为a 0a
1 的 数 量 为 b 1的数量为b 1b
如 果 a = b , 显 然 答 案 为 m a x ( a − 1 , 0 ) 如果a=b,显然答案为max(a-1,0) a=bmax(a1,0)
如 果 a > b , 答 案 为 b 如果a>b,答案为b a>bb
如 果 a < b , 答 案 为 a 如果a<b,答案为a a<ba
时间复杂度 O n On On

#include <bits/stdc++.h>
#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 cf int _; cin>> _; while(_--)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int> 
#define re register int
#define lb lower_bound
#define ub upper_bound
#define int long long 
#define pb push_back
#define y second 
#define x first 
using namespace std;
inline void sf2(int &a , int &b) { sf(a) , sf(b) ;}
inline void sf3(int n , int a[]) {fer(i,1,n) sf(a[i]);} ;
inline void de(auto x) {cout << x << "\n" ;}
inline void de2(auto a , auto b) {cout << a << " " << b << "\n" ;}
inline void de3(int n , auto a[]){fer(i,1,n) cout << a[i] << " " ;puts("");}
inline void mo(int &a , int b) {a = (a % b + b) % b ;}
inline int gcd(int a,int b){return b ? gcd(b , a % b) : a ;}
inline int qpow(int a,int b,int c){int res=1%c;a%=c;while(b>0){if(b&1)res=res*a%c;a=a*a%c;b>>=1;}return res;}
inline int qadd(int a,int b,int c){int res=0;a%=c;while(b>0){if(b&1)res=(res+a)%c;a=(a+a)%c;b>>=1;}return res;} 
const int inf = 0x3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f ;
const int N = 1e6 + 10 , M = 3010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;
 
signed main()
{
    cf
    {
        string s ;
        
        int s1 = 0 , s2 = 0 ;
        
        cin >> s ;
        
        for(auto i : s)
        {
            if(i == '1') s1 ++ ;
            else s2 ++ ;
        }
        
        if(s1 == s2) de(max(s1 - 1 , 0ll)) ;
        else if(s1 > s2) de(s2) ;
        else de(s1) ;
    }
    return 0;
}

C. Kill the Monster

思路
注 意 到 k 的 总 和 为 2 e 5 注意到k的总和为2e5 k2e5
那 么 我 们 可 以 枚 举 生 命 h c 加 i 次 , 攻 击 d c 加 k − i 次 那么我们可以枚举生命hc加i次,攻击dc加k-i次 hci,dcki
o 1 判 断 即 可 o1判断即可 o1
时 间 复 杂 度 o k 时间复杂度ok ok

如 何 o 1 判 断 如何o1判断 o1
敌 人 杀 死 我 需 要 ⌈ h c d m ⌉ 个 回 合 敌人杀死我需要\lceil \frac{hc}{dm} \rceil个回合 dmhc
我 杀 死 敌 人 需 要 ⌈ h m d c ⌉ 个 回 合 我杀死敌人需要\lceil \frac{hm}{dc} \rceil个回合 dchm
即 即
⌈ h c d m ⌉ > = ⌈ h m d c ⌉ \lceil \frac{hc}{dm} \rceil >= \lceil \frac{hm}{dc} \rceil dmhc>=dchm

时间复杂度 O k Ok Ok

#include <bits/stdc++.h>
#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 cf int _; cin>> _; while(_--)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int> 
#define re register int
#define lb lower_bound
#define ub upper_bound
#define int long long 
#define pb push_back
#define y second 
#define x first 
using namespace std;
inline void sf2(int &a , int &b) { sf(a) , sf(b) ;}
inline void sf3(int n , int a[]) {fer(i,1,n) sf(a[i]);} ;
inline void de(auto x) {cout << x << "\n" ;}
inline void de2(auto a , auto b) {cout << a << " " << b << "\n" ;}
inline void de3(int n , auto a[]){fer(i,1,n) cout << a[i] << " " ;puts("");}
inline void mo(int &a , int b) {a = (a % b + b) % b ;}
inline int gcd(int a,int b){return b ? gcd(b , a % b) : a ;}
inline int qpow(int a,int b,int c){int res=1%c;a%=c;while(b>0){if(b&1)res=res*a%c;a=a*a%c;b>>=1;}return res;}
inline int qadd(int a,int b,int c){int res=0;a%=c;while(b>0){if(b&1)res=(res+a)%c;a=(a+a)%c;b>>=1;}return res;} 
const int inf = 0x3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f ;
const int N = 1e6 + 10 , M = 3010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;
 
bool check(int hc , int dc , int hm , int dm)
{
    int len = (hc + dm - 1) / dm ;
    if(len * dc >= hm) return 1 ;
    else return 0 ;
}
 
signed main()
{
    cf
    {
        int hc , dc , hm , dm , k , w , a ;
        
        sf2(hc , dc) ;
        sf2(hm , dm) ;
        sf(k) ;
        sf2(w , a) ;
        
        int f1 = 0 ;
        
        for(int i = 0 ; i <= k ; i ++)
        {
            int j = k - i ;
            
            if(check(hc + i * a , dc + j * w , hm , dm )) f1 = 1 ;    
        }
        
        if(f1) puts("YES") ;
        else puts("NO") ;
    }
    return 0;
}

D. Make Them Equal

思路
注 意 到 每 次 a [ i ] 变 成 b [ i ] 都 是 从 1 开 始 变 化 的 注意到每次a[i]变成b[i]都是从1开始变化的 a[i]b[i]1

也 就 是 说 我 们 可 以 先 预 处 理 一 个 数 组 d [ i ] 数 组 也就是说我们可以先预处理一个数组d[i]数组 d[i]
表 示 1 变 化 到 i 的 最 小 操 作 数 表示1变化到i的最小操作数 1i

注 意 到 b [ i ] 的 最 大 值 是 1 e 3 注意到b[i]的最大值是1e3 b[i]1e3
我 们 可 以 暴 力 b f s 用 O 1 e 6 的 时 间 复 杂 度 预 处 理 该 数 组 我们可以暴力bfs用O1e6的时间复杂度预处理该数组 bfsO1e6

然 后 在 把 题 目 转 换 一 下 然后在把题目转换一下
操 作 数 最 多 是 k 操作数最多是k k
对 于 每 个 i , 变 成 b [ i ] 的 操 作 数 为 d [ i ] 对于每个i,变成b[i]的操作数为d[i] i,b[i]d[i]
你 可 以 得 到 c [ i ] 个 硬 币 你可以得到c[i]个硬币 c[i]

显 然 , 操 作 数 k 我 们 可 以 看 作 是 背 包 体 积 显然,操作数k我们可以看作是背包体积 ,k
对 于 每 个 i , 变 成 b [ i ] 的 操 作 数 为 d [ i ] , 可 以 看 作 是 物 品 i 的 体 积 为 d [ i ] 对于每个i,变成b[i]的操作数为d[i],可以看作是物品i的体积为d[i] i,b[i]d[i],id[i]
你 可 以 得 到 c [ i ] 个 硬 币 , 可 以 看 作 是 物 品 i 的 价 值 c [ i ] 你可以得到c[i]个硬币,可以看作是物品i的价值c[i] c[i],ic[i]

每 个 物 品 最 多 选 一 次 , 跑 01 背 包 即 可 每个物品最多选一次,跑01背包即可 ,01

注 意 到 d [ i ] 数 组 的 最 大 值 为 12 注意到d[i]数组的最大值为12 d[i]12
也 就 是 说 背 包 体 积 最 大 为 12 ∗ 1 e 3 也就是说背包体积最大为12*1e3 121e3
假 设 背 包 体 积 为 m , m = m i n ( 12 ∗ n , k ) 假设背包体积为m,m=min(12*n,k) m,m=min(12n,k)

时 间 复 杂 度 = m i n ( 12 ∗ n , k ) ∗ n + n 2 ≈ 1 e 7 时间复杂度=min(12*n,k)*n + n^2 \approx 1e7 =min(12n,k)n+n21e7
时间复杂度 O m i n ( 12 ∗ n , k ) ∗ n + n 2 Omin(12*n,k)*n + n^2 Omin(12n,k)n+n2

#include <bits/stdc++.h>
#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 cf int _; cin>> _; while(_--)
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define sf(x) scanf("%lld",&x)
#define pll pair<int,int> 
#define re register int
#define lb lower_bound
#define ub upper_bound
#define int long long 
#define pb push_back
#define y second 
#define x first 
using namespace std;
inline void sf2(int &a , int &b) { sf(a) , sf(b) ;}
inline void sf3(int n , int a[]) {fer(i,1,n) sf(a[i]);} ;
inline void de(auto x) {cout << x << "\n" ;}
inline void de2(auto a , auto b) {cout << a << " " << b << "\n" ;}
inline void de3(int n , auto a[]){fer(i,1,n) cout << a[i] << " " ;puts("");}
inline void mo(int &a , int b) {a = (a % b + b) % b ;}
inline int gcd(int a,int b){return b ? gcd(b , a % b) : a ;}
inline int qpow(int a,int b,int c){int res=1%c;a%=c;while(b>0){if(b&1)res=res*a%c;a=a*a%c;b>>=1;}return res;}
inline int qadd(int a,int b,int c){int res=0;a%=c;while(b>0){if(b&1)res=(res+a)%c;a=(a+a)%c;b>>=1;}return res;} 
const int inf = 0x3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f3f ;
const int N = 1e6 + 10 , M = 3010 , mod = 1e9 + 7 ;
const double eps = 1e-7 , pi = acos(-1.0) ;
 
int n , k ;
int b[N] ;
int c[N] ;
int d[N] ;
int f[N] ;
 
signed main()
{
	// bfs预处理d数组
    memset(d , -1 , sizeof d) ;
    d[1] = 0 ;
    queue<int> q ;
    q.push(1) ;
    while(q.size())
    {
        auto t = q.front() ;
        q.pop() ;
        
        for(int j = 1 ; j <= t ; j ++)
        {
            int x = t + t / j ;
            if(x > 1e3) continue ;
            if(d[x] != -1 || x == 1) continue ;
            
            d[x] = d[t] + 1 ;
            q.push(x) ;
        }
    }
    
    cf
    {
        cin >> n >> k ;
        fer(i,1,n) sf(b[i]) ;
        fer(i,1,n) sf(c[i]) ;
        
        int m = min(k,20000*1ll) ;
        fer(i,0,m) f[i] = 0 ;
 		
 		// 01背包
        for(int i = 1 ; i <= n ; i ++)
        {
            for(int j = m ; j >= d[b[i]] ; j --)
                f[j] = max(f[j],f[j - d[b[i]]] + c[i]);
        }
        
        de(f[m]) ;
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
"educational codeforces round 103 (rated for div. 2)"是一个Codeforces平台上的教育性比赛,专为2级选手设计评级。以下是有关该比赛的回答。 "educational codeforces round 103 (rated for div. 2)"是一场Codeforces平台上的教育性比赛。Codeforces是一个为程序员提供竞赛和评级的在线平台。这场比赛是专为2级选手设计的,这意味着它适合那些在算法和数据结构方面已经积累了一定经验的选手参与。 与其他Codeforces比赛一样,这场比赛将由多个问题组成,选手需要根据给定的问题描述和测试用例,编写程序来解决这些问题。比赛的时限通常有两到三个小时,选手需要在规定的时间内提交他们的解答。他们的程序将在Codeforces的在线评测系统上运行,并根据程序的正确性和效率进行评分。 该比赛被称为"educational",意味着比赛的目的是教育性的,而不是针对专业的竞争性。这种教育性比赛为选手提供了一个学习和提高他们编程技能的机会。即使选手没有在比赛中获得很高的排名,他们也可以从其他选手的解决方案中学习,并通过参与讨论获得更多的知识。 参加"educational codeforces round 103 (rated for div. 2)"对于2级选手来说是很有意义的。他们可以通过解决难度适中的问题来测试和巩固他们的算法和编程技巧。另外,这种比赛对于提高解决问题能力,锻炼思维和提高团队合作能力也是非常有帮助的。 总的来说,"educational codeforces round 103 (rated for div. 2)"是一场为2级选手设计的教育性比赛,旨在提高他们的编程技能和算法能力。参与这样的比赛可以为选手提供学习和进步的机会,同时也促进了编程社区的交流与合作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值