IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Educational Codeforces Round 122 (Rated for Div. 2) -> 正文阅读

[C++知识库]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();
    }
}
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-10 22:13:22  更:2022-03-10 22:15:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:58:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码