Educational Codeforces Round 122 (Rated for Div. 2)

A - Div. 7

题意

更改更少的数字使其原本的数字变为7的倍数

题解

因为7小于10,所以说,10个以内一定会有至少有一个7的倍数

所以说只需要更改最后一位就行了

题目要求如果已经是7的倍数就直接输出,这里要注意一下

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <sstream>
#include <unordered_map>
#define ll long long
#define ull unsigned long long
#define re return
#define pb push_back
#define Endl "\n"
#define endl "\n"
#define x first
#define y second
#define all(x) (x).begin(),(x).end()

using namespace std;

typedef pair<int, int> PII;

const int N = 1e5 + 10;
const int M = 1e5 + 10;
const int mod = 1000000007;
const int INF = 0x3f3f3f3f;

int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};

int T;
int n;

void solve(){
    cin >> n;
    if(n % 7 == 0){
        cout << n << endl;
        return;
    }
    for (int i = 0; i < 10; i++){
        int x = n / 10 * 10 + i;
        if(x % 7 == 0){
            cout << x << endl;
            return;
        }
    }
}

int main(){
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    T = 1;
    cin >> T;
    while(T--){
        solve();
    }
}

B - Minority

题意

给定一个字符串,让你找到一个子串,可以删除数量最少的0或者1,问最多删除多少个最少的字符

题解

假设存在一个子串,使得某一个位数的值在子串扩大后不会变多,也就是一定会是最终答案了,那么这时候我们扩大子串长度也不会改变其答案,那么我们就不如不去找那个子串,直接就去弄成整个字符串

这样我们直接判断也就行了

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <sstream>
#include <unordered_map>
#define ll long long
#define ull unsigned long long
#define re return
#define pb push_back
#define Endl "\n"
#define endl "\n"
#define x first
#define y second
#define all(x) (x).begin(),(x).end()

using namespace std;

typedef pair<int, int> PII;

const int N = 1e5 + 10;
const int M = 1e5 + 10;
const int mod = 1000000007;
const int INF = 0x3f3f3f3f;

int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};

int T;
string s;

void solve(){
    cin >> s;
    int x = 0;
    int y = 0;
    for(auto i : s){
        if(i == '1')
            x++;
        else
            y++;
    }

    if(x != y){
        cout << min(x, y) << endl;
    }
    else{
        cout << x - 1 << endl;
    }
}

int main(){
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    T = 1;
    cin >> T;
    while(T--){
        solve();
    }
}

C - Kill the Monster

题意

给定角色的血量和攻击力,还有怪物的血量和攻击力,每次可以花费1金币选择升级血量或者伤害

每次角色先攻击

问在给定的已知双方血量和攻击力,和能花费的最多金币,能不能杀掉怪物

题解

当然我们知道,肯定金币全都用掉好

这时候就要注意题目中给定的k的范围了

k最大到2e5,那么我们可以直接枚举多少钱加血,多少钱加攻击

然后回合制的经典类型,看看谁能撑的更久

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <sstream>
#include <unordered_map>
#define ll long long
#define ull unsigned long long
#define re return
#define pb push_back
#define Endl "\n"
#define endl "\n"
#define x first
#define y second
#define all(x) (x).begin(),(x).end()

using namespace std;

typedef pair<int, int> PII;

const int N = 1e5 + 10;
const int M = 1e5 + 10;
const int mod = 1000000007;
const int INF = 0x3f3f3f3f;

int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};

int T;
ll hc;
int dc;
ll hm;
int dm;
int k, w, a;

void solve(){
    cin >> hc >> dc;
    cin >> hm >> dm;
    cin >> k >> w >> a;

    // 先加生命
    for (int i = 0; i <= k; i++){
        ll h = hc + a * i;
        ll d = dc + w * (k - i);

        // cout << h << ' ' << d << endl;

        ll tc = h / dm + (h % dm != 0);
        ll tm = hm / d + (hm % d != 0);

        if(tc >= tm){
            cout << "YES" << endl;
            return;
        }
    }

    cout << "NO" << endl;
}

int main(){
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    T = 1;
    cin >> T;
    while(T--){
        solve();
    }
}

D - Make Them Equal

题意

原始数组a全为1,每一次可进行操作 a [ i ] = a [ i ] + ⌊ a [ i ] x ⌋ , x < 0 a[i]=a[i] + \lfloor \frac{a[i]}{x} \rfloor,x<0 a[i]=a[i]+xa[i],x<0,每个数如果达到了与 b [ i ] b[i] b[i]相同的值,就可以获得对应价值 c [ i ] c[i] c[i],问在不超过k次操作下,获得的最大收益是多少

题解

首先我们上来知道第一件事肯定是模拟样例

4 4
1 7 5 2
2 6 5 2

9

第一个样例给的答案是9,那么能凑出来9这个答案的肯定是选择第1、3、4来进行变换的

a[1]=1=b[1],那么得到了c[1]的贡献

如果我们要是将a[2]变成b[2]应该花掉几步呢?

0 1 2   3    4 5
1 2 3/4 5/6  7 ...

经过我们的计算最少应当花掉4步

不知你有没有看懂这个算法,就是将当前的数,加上他除以他前面所有的数的下取整所花的步数再加一

那么花掉4步得到的价值是7,花掉3步得到的价值是5,花掉1步得到夹着2,这是什么

这不就是01背包吗

步数是花费,c是价值,我们预处理出来1e3中的所有的步数,然后跑一下01背包就可以了

Code

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <sstream>
#include <unordered_map>
#define ll long long
#define ull unsigned long long
#define re return
#define pb push_back
#define Endl '\n'
#define endl '\n'
#define x first
#define y second
#define all(x) (x).begin(),(x).end()

using namespace std;

typedef pair<int, int> PII;

const int N = 1e5 + 10;
const int M = 1e5 + 10;
const int mod = 1000000007;
const int INF = 0x3f3f3f3f;

int dx[4] = {-1,0,1,0};
int dy[4] = {0,1,0,-1};

int T;
int n, k;
int b[N];
int c[N];
int f[N * 10];
int base[N];

void get_divisors(int x){
    for (int i = 1; i <= x; i++){
        base[x + x / i] = min(base[x + x / i], base[x] + 1); 
    }
}

void solve(){
    cin >> n >> k;
    for (int i = 1; i <= n; i++){
        cin >> b[i];
        // cout << b[i] << ' ' << base[b[i]] << endl;
        
        b[i] = base[b[i]];
        
    }
    // cout << endl;
    for (int i = 1; i <= n; i++){
        cin >> c[i];
    }

    for (int i = 1; i <= n; i++){
        for (int j = k; j >= b[i]; j--){
            f[j] = max(f[j], f[j - b[i]] + c[i]);
        }
    }

    cout << f[k] << Endl;

    memset(f, 0, sizeof(f));
}

int main(){
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    
    memset(base, 0x3f, sizeof(base));
    base[1] = 0;
    // base[2] = 1;

    for (int i = 1; i <= 1e3; i++){
        get_divisors(i);
    }

    // for (int i = 1; i <= 15; i++){
    //     cout << i << ' ' << base[i] << endl;
    // }
    // cout << endl;

    T = 1;
    cin >> T;
    while(T--){
        solve();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值