首页 > 其他分享 >CSP-J 2023 题解

CSP-J 2023 题解

时间:2023-10-28 17:55:52浏览次数:35  
标签:dist int 题解 sum 2023 long rint CSP define

CSP-J 2023 题解

T1 小苹果

这个题直接遍历枚举必定 TLE,这是 CCF 的出题风格,每题 T1 巨水无比,但是往往又需要一些思维。

这道题我们可以发现每一轮操作都会拿走 \(1 + (n - 1) / 3\) 个苹果,所以每次让 \(n\) 减去 \(1 + (n - 1) / 3\) 就可以了。

然后记录编号为 \(n\) 什么时候拿的即可。要注意加个 flag 防止重复选择。

#include <bits/stdc++.h>

#define rint register int
#define endl '\n'
#define int long long

int n;
int day, pos;
bool flag;

using namespace std;

signed main() 
{
    cin >> n;

    while (n > 0) 
	{
        day++;

        if ((n - 1) % 3 == 0 && !flag) 
		{
            flag = 1;
            pos = day;
        }

        n -= (1 + (n - 1) / 3);
    }

    cout << day << ' ' << pos << endl;
    
    return 0;
}

T2 公路

这个题难在于怎么想贪心。

到一个加油站的时候,先别加油,因为不知道后面需要多少油。

等到缺油的时候再从之前经过的最便宜的加油站加油。

加油量为 \(sum / d\),\(sum\) 表示还需要走的公里数

#include <bits/stdc++.h>

#define rint register int
#define int long long
#define endl '\n'

using namespace std;

const int N = 1e5 + 5;

int a[N];
int v[N];
int n, d;//变量名含义同题
int ans, sum;

signed main() 
{
    cin >> n >> d;
    for (rint i = 1; i < n; i++) 
	{
		cin >> v[i];
	}//按题目要求读入
	
    int minn = 1145141919810ll;//随便给一个特别大的数
    
    for (rint i = 1; i < n; i++) 
	{ 
        cin >> a[i];
        sum += v[i];//记录和
        minn = min(minn, a[i]);//记录价格最小值
        ans += (sum + d - 1) / d * minn;//在向下取整的时候减一是好习惯
        sum -= (sum + d - 1) / d * d;//在 CCF 考试题中,计算时无需考虑取整,因为自动向下取整
    }
    
    cout << ans << endl;
    
    return 0;
}

T3 一元二次方程

直接按照题目模拟即可,没什么难的,然后有一个比赛小技巧,就是没事儿多看看部分分,有 50pts 的部分分有手就能拿:

针对特殊性质 C

int T;
scanf("%d%*d", &T);
const int N = 2e3;
while (T--) 
{
    int a, b, c, ans, flag = 0;
    cin >> a >> b >> c;
    for (rint i = -N; i <= N; i++) 
	{
        if (a * i * i + b * i + c == 0) 
		{
			ans = i;
			flag = true;
		}
    }
    if (flag)
    {
		cout << ans << endl;
	}
    else puts("NO");
}

有几个注意的要点:

  • 1.不一定较大的解是 \(+sqrt(delta)\) 那个解,因为 \(a\) 可能是负数!!!
  • 2.约分时注意细节

代码不写了,因为这个傻逼还没过。

T4 公路

个人认为本次 CSP 普及加提高中出的质量最高的一个题,没有之一!真的没想到分层图最短路可以这么考。

分层图问题,即图上每个点要拆分成 \(k\) 个状态,在建图的时候要微调。

在跑 dijkstra 的时候注意,对于原代码中的 \(dist[y] = dist[x] + z\) 更新的时候,要这么写:

z = 1;//不是 z = w[i]
if (dist[x] < w[i]) z += ((w[i] - dist[x] + k - 1) / k) * k;

为什么?当前的边需要的时间是 \(t_1\) 大于目前时间 \(t_2\),让出发时间延后 \(ceil((t_1 - t_2) / k) * k\) 单位时间。

#include <bits/stdc++.h>

#define rint register int
#define int long long
#define endl '\n'

using namespace std;

const int N = 2e6 + 5;
const int M = 4e6 + 5;

int n, m, k;
int h[N], w[M], e[M], ne[M], idx, dist[M];
bool v[M];
priority_queue<pair<int, int> > q;

void add(int a, int b, int c) 
{
    e[++idx] = b, ne[idx] = h[a], w[idx] = c, h[a] = idx;
}

void dijkstra() 
{
    memset(dist, 0x3f, sizeof dist);
    dist[1] = 0;
    q.push(make_pair(0, 1));
    while (!q.empty()) 
	{
        int x = q.top().second;
        q.pop();
        if (v[x]) 
		{
            continue;
        }
        v[x] = 1;
        for (rint i = h[x]; i; i = ne[i]) 
		{
            int y = e[i];
            int z = 1;
            if (dist[x] < w[i]) 
			{
                z += ((w[i] - dist[x] + k - 1) / k) * k;
            }
            if (dist[y] > dist[x] + z) 
			{
                dist[y] = dist[x] + z;
                q.push(make_pair(-dist[y], y));
            }
        }
    }
}

signed main() 
{
    cin >> n >> m >> k;
    
    for (rint i = 1; i <= m; i++) 
	{
        int a, b, c;
        cin >> a >> b >> c;
        for (rint j = 0; j < k; j++) 
		{
            add(a + j * n, b + ((j + 1) % k) * n, c);
        }
    }
    
    dijkstra();
    
    if (dist[n] >= 0x3f3f3f3f)
    {
		cout << -1 << endl;
		return 0;
	}
    
    cout << dist[n] << endl;
    
    return 0;
}

标签:dist,int,题解,sum,2023,long,rint,CSP,define
From: https://www.cnblogs.com/spaceswalker/p/17794373.html

相关文章

  • test20231028
    最小丑的一回(好像并不是)T1是个简单题,只要会高中基础几何就行了。T2看上去是个暴力,然后我也写了个暴力,结果跑大样例dfs进行到两万多层的时候RE了,完全不知道为什么,然后调调调调了一个多小时,到了十点放弃T2开始干T3。T3看起来是个数学题,然后退式子,推推推大概半个小时过......
  • 「联合省选 2020 A」组合数问题 题解
    非常显然的,我们展开\(f(k)\),于是有:\[\begin{align}&\sum\limits_{k=0}^{n}\sum\limits_{i=0}^{m}a_{i}k^{i}x^{k}\binom{n}{k}\\=&\sum\limits_{k=0}^{n}\sum\limits_{i=0}^{m}a_{i}{\sum\limits_{j=0}^{i}\begin{Bmatrix}i\\j\end{Bmatrix}\binom{......
  • 考场(NOIP2023模拟5联测26)
    T1题目好评,但是hanzelic小姐是大主播啊。对于\(a_1\)^\(a_2\)^\(a_3\)^\(a_4\)......来说,要让\(a_2\)^\(a_3\)^\(a_4\)最小。啊,为什么我觉得运算顺序不会对这个题造成影响啊QAQ,我是菜狗QAQ。奥,我的意思是让所有次幂乘起来最小,因为\(x*y\)一定小于等于\(x^y......
  • CSP2023 总结
    CSP2023总结前言这次CSP2023并没有考出水平。经过深刻反思,我总结了个人目前存在的一些问题与改进的方案。上午CSP-J开始后,手忙脚乱地建好了目录文件、配置好了DEV-C++的语法环境、切换好了ENG输入法。T1看到T1发现不如去年简单,有些慌张。努力冷静下来后,推了一下,......
  • 2023-2024-1-20231317<<计算机基础与程序设计>>第五周学习总结
    《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程<班级的链接>(2023-2024-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础与程序设计第五周作业)这个作业的目标<学习《C语言第五章选择控制结构、第六章循......
  • 2023Fal-操作系统-Chapter3-处理机调度与死锁
    本文为笔者的课程学习记录,用于复习与查阅,如有错误,烦请指正。01处理机调度的层次和调度算法的目标1.1何为调度?在多道程序系统中,调度的实质是一种资源分配,处理机调度是对处理机资源进行分配。1.2何为调度算法?处理机调度算法是指根据处理机分配策略所规定的处理机分配算法。......
  • CSP2023好
    好,CSP好呀Beforecsp考前最后一次联考(信心赛)自信以为ak提前出教室结果挂在了一道出锅的题对,没错,真的不理解为什么没有人想到很容易的hack然后良心的出题人就把题目改回原题了对然后\(luogu\)冲了一个智者的强迫症A题数量然后就去吃了一顿牛状元然后\(mi\)哥点了一个......
  • CSPS-2023
    密码锁(lock)考场想推一个复杂度牛逼的东西,后来发现直接\(O(10^5)\)枚举状态,\(O(40)\)判断合不合法就行了。并且我考场降智了,我乘上了一个\(O(2^8)\)枚举每个状态推到这八种密码是用哪种操作,但其实可以不用判断的,因为我们只关心行不行,不关心是用的哪种操作。但是因为我加了......
  • CF777E题解
    分析看到这个题就想到了二维偏序。你们很自然地,以\(b\)为第一关键字降序排序,当有若干个片\(b\)相等时,我们发现由于\(a<b\),所以排到最后的片一定能把这些\(b\)相等的片都统计上,而前面的片能否统计是依赖于\(b\),所以考虑如何让后面的片更好统计,显然\(a\)越小越好统......
  • 2023-2024-1 20211306 密码系统设计与实现课程学习笔记7
    20211306密码系统设计与实现课程学习笔记7任务详情自学教材第4章,提交学习笔记知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容“我在学***X知识点,请你以苏格拉底的方式对我进行提问,一次一个问题......