首页 > 其他分享 >ZZJC新生训练赛第四场题解

ZZJC新生训练赛第四场题解

时间:2024-10-17 20:22:36浏览次数:4  
标签:matt 第四场 ZZJC int 题解 long -- qe ans

ZZJCACM新生训练赛 - 2024.10.16

题目难度

  • Easy(简单): B, C, D, G
  • Medium(中等): A, E
  • Anti-AK(防AK): E

C题解题思路

A页既可以是彩印也可以是黑白印,B页只能是彩印,所以只要比较A页彩印和A页黑白印的价格高低就好。
因为 a, b, x, y 最大都是 1e9,用 int 直接相乘的话会爆掉,所以要开 long long。

C题代码

#include<bits/stdc++.h>
#define int long long
const int N = 1e6 + 10;
using namespace std;

void matt(){
    int a, b, x, y;
    cin >> a >> b >> x >> y;
    cout << min((a + b) * y, a * x + b * y) << '\n';
}

signed main(){
    ios::sync_with_stdio(false); 
    cin.tie(0);
    cout.tie(0); // 加快 cin, cout 输入输出速度
    int T = 1;
    cin >> T;
    while (T--)
    {
        matt();
    }
    return 0;
}

D题解题思路

有一部分人一道题都没对的情况下 AK 的人最多。

D题代码

#include<bits/stdc++.h>
#define int long long
const int N = 1e6 + 10;
using namespace std;

void matt(){
    int a, b, c;
    cin >> a >> b >> c;
    cout << c / a;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T = 1;
    // cin >> T;
    while (T--)
    {
        matt();
    }
    return 0;
}

B题解题思路

根据题意,要让怪兽血量扣得最多,伤害越高的药水最先使用。注意怪兽血量要向下取整。

B题代码

#include<bits/stdc++.h>
#define int long long
const int N = 1e6 + 10;
using namespace std;
int a[10];

void matt(){
    int n, ans;
    cin >> n >> a[0] >> a[1] >> a[2];
    sort(a, a + 3);
    ans = n;
    for (int i = 2; i >= 0; i--)
    {
        int x = ans - ans * 0.01 * a[i]; // int 自动会向下取整
        ans = x;
    }
    cout << n - ans;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T = 1;
    // cin >> T;
    while (T--)
    {
        matt();
    }
    return 0;
}

G题解题思路

根据题意直接对 l 和 r 开根号,数一下两者之间有几个数字。注意 x 要向上取整,y 要向下取整。

G题代码

#include<bits/stdc++.h>
// #define int long long
const int N = 1e5 + 10;
using namespace std;

void matt(){
    int l, r;
    cin >> l >> r;
    int x = ceil(sqrt(l));
    int y = sqrt(r);
    cout << y - x + 1 << '\n';
}

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

A题解题思路

如果直接暴力枚举的话肯定会超时。
所以我们记录前面没被删除的字符串,碰到 'c' 和 'b',去寻找前面那个没被删除的字符,判断是否需要删除。

A题代码

#include<bits/stdc++.h>
#define int long long
const int N = 1e6 + 10;
using namespace std;
int a[N] = {0}; // 数组 a 用来记录前面没被删除的字符的下标位置

void matt(){
    int n, ans = 1; // ans 是数组 a 存放字符的个数
    string s;
    cin >> n >> s;
    for (int i = 1; i < n; i++)
    {
        if (s[i] == 'c' && s[a[ans - 1]] == 'f' || s[i] == 'b' && s[a[ans - 1]] == 't') ans--; // 判断是否需要删除,如果需要 ans 减一
        else a[ans++] = i; // 如果不需要,将 s[i] 字符的下标添加到 a 中
    }
    cout << ans;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T = 1;
    // cin >> T;
    while (T--)
    {
        matt();
    }
    return 0;
}

F题解题思路

当找到右括号的时候寻找左括号个数,其中任意一个都可以和当前右括号匹配。注意取余。

F题代码

#include<bits/stdc++.h>
#define int long long
const int N = 1e6 + 10, mod = 1e9 + 7;
using namespace std;

void matt(){
    string s;
    cin >> s;
    int n = s.size(), ans = 0, sum = 1;
    for (int i = 0; i < n; i++)
    {
        if (s[i] == '(') ans++;
        else{
            sum *= ans;
            sum %= mod;
            ans--;
        }
    }
    cout << sum;
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T = 1;
    // cin >> T;
    while (T--)
    {
        matt();
    }
    return 0;
}

E题解题思路

经典模拟题,根据题意用结构体 CPU 存储进程号,到达时间等信息,用优先队列 priority_queue 存储已经到达的进程号。每当一个进程号到达的时候,去判断前面到达的进程号的完成情况。

E题代码

#include<bits/stdc++.h>
#define int long long
const int N = 2e4 + 10;
using namespace std;

struct CPU
{
    int cjh, ddsj, zxsj, yxj;
    bool operator<(const CPU &x) const
    {
        if (x.yxj == yxj) return ddsj > x.ddsj;
        else return yxj < x.yxj;
    }
}; // 创建一个结构体,存储进程号等信息,并且在优先队列里面根据题意排序

void matt(){
    int a, b, c, d;
    priority_queue<CPU> qe; // 创建一个优先队列 qe
    int t = 0;
    while (cin >> a >> b >> c >> d) // 输入数据
    {
        while (!qe.empty() && b >= t + qe.top().zxsj){
            t += qe.top().zxsj;
            cout << qe.top().cjh << ' ' << t << '\n';
            qe.pop();
        } // 当队列非空情况下,将在此进程号到达之前的已经完成的进程号输出
        if (qe.empty()){
            qe.push({a, b, c, d});
            t = b;
        } // 当队列为空的情况下,将数据输入 qe
        else {
            if (d > qe.top().yxj){
                CPU tmp = qe.top();
                tmp.zxsj -= b - t;
                qe.pop();
                qe.push(tmp);
                qe.push({a, b, c, d});
                t = b;
            } // 当输入的进程号的优先级大于当前正在进行的进程号时,优先进行操作
            else qe.push({a, b, c, d}); // 否则直接将数据输入 qe
        }
    }
    while (!qe.empty())
    {
        t += qe.top().zxsj;
        cout << qe.top().cjh << ' ' << t << '\n';
        qe.pop();
    } // 将队列中剩余数据输出
}

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    int T = 1;
    // cin >> T;
    while (T--)
    {
        matt();
    }
    return 0;
}

标签:matt,第四场,ZZJC,int,题解,long,--,qe,ans
From: https://www.cnblogs.com/udiandianis/p/18472992

相关文章

  • DMA连续发送多帧但是只有最后一帧数据发出问题解决方法
    问题描述DMA连续发送多帧但是只有最后一帧数据发出原因分析DMA发送未完成时,下次DMA请求启动,导致之前的数据被放弃传输了解决办法创建DMA发送缓冲区,当启动DMA请求的时候,检测DMA设备是不是正在忙,如果正在忙,就把数据放入发送缓冲区等待,上次DMA发送完成的时会产生DMA发送完......
  • 【学校训练记录】10月个人训练赛3个人题解
    A:根据题意我们可知,第一种事件为从1到i的和,第二种事件为从y到i的和故我们可以通过前缀和来保存从i到i+1所化的时间。再遍历寻找最小值即可#include<bits/stdc++.h>#defineendl"\n"#defineintlonglongusingnamespacestd;intn,a[1010];voidsolve(){ cin>>n;......
  • 题解:GZOI2024 D2T2 乒乓球
    考场上切了,但是比较神奇的题,应该是蓝/紫。Discription乒乓球\(\text{}\)时间限制:\(\bold{3}\)秒众所周知,一场乒乓球比赛共有两个玩家\(A\)和\(B\)参与,其中一场比赛由多局比赛组成,而每局比赛中又由多盘比赛组成。每盘比赛\(A\)或\(B\)只有一名选手获胜。当其中一名......
  • [题解]P1311 [NOIP2011 提高组] 选择客栈
    P1311[NOIP2011提高组]选择客栈P6032选择客栈加强版只要\([l,r]\)区间之内存在一个\(i\)使得\(w[i]\lep\),这个区间就是符合条件的。所以我们遍历每一个元素\(i\),根据贪心的思想我们维护\([1,i]\)区间内满足\(w[i]\lep\)的最大\(i\),记为\(mp\)。对于每个元素\(i\),寻找\(......
  • 【题解】twt studio2024 萌新欢乐赛
    迟来的题解本文更新到个人主页中,后续如果有任何修正变动也只会在网页端更新~特别鸣谢小羽毛在羽猫球一题的题解:)感谢兴航学弟在T3的题解。比赛链接:https://www.luogu.com.cn/contest/196515T1签到题,所有参与选手均满分。略。T2https://www.luogu.com.cn/article/37n1idam......
  • P9731 [CEOI2023] Balance 题解
    首先考虑\(S=2\)怎么做,我们把它转化为图论问题。对于每一行的两个点的颜色连一条无向边,那我们相当于要给这些边定向。最后要求\(|in_u-out_u|\le1\)。会发现这个要求很像欧拉回路。但是欧拉回路是要求每个点的入度和出度相等,怎么办呢?我们再建一个超级源点,向每个奇数度数的点......
  • 常见ElasticSearch 面试题解析(上)
    前言ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulweb接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。ElasticSearch用于云计算中,能够达到实时搜索,稳定,可靠,......
  • 2024-10-17每日一题题解
    最大子段和题目描述给出一个长度为\(n\)的序列\(a\),选出其中连续且非空的一段使得这段和最大。样例输入72-43-12-43样例输出4题解tips:无脑暴力法:枚举每一段区间,再对每一段区间求和,时间复杂度为\(O(n^3)\),会超时(n为1e5,则应该在\(O(nlogn)\)的时间范围内)......
  • 【题解】【记忆化递归】——Function
    【题解】【记忆化递归】——FunctionFunction题目描述输入格式输出格式输入输出样例输入#1输出#1提示数据规模与约定1.思路解析2.AC代码Function通往洛谷的传送门题目描述对于一个递归函数w......
  • PTA L1系列题解(C语言)(L1_073 -- L1_080)
    L1-073人与神题目内容:L1-073人与神-团体程序设计天梯赛-练习集(pintia.cn)跨界大神L.PeterDeutsch有一句名言:“Toiterateishuman,torecursedivine.”(迭代的是人,递归的是神)。本题就请你直接在屏幕上输出这句话。输入格式:本题没有输入。输出格式:在一行中输......