Codeforces Round 931 (Div. 2)
题目链接 - Codeforces Round 931 (Div. 2) A. Too Min Too Max题意给出一个数组, 现在要你选择四个下标$i,j,k,l$ , 问$|a_i - a_j|+|a_j - a_k|+|a_k - a_l|+|a_l - a_i|$ 最大是多少。($i , j,k,l$ 必须互不相同) 思路题目要求的其实就是选出四个数组成一个环,使得相邻两个数的差的和最大。 于是我们先探究 : 如果选出了某四个数,如何调整他们在环中的顺序能使得总和最大。 不难想到, 将较大的两个数放在第一和第三位, 较小的两个数放在第二和第四位时, 得到的结果最大。 此时为($a_i - a_j) +( a_k - a_j )+ (a_k - a_l)+(a_i - a_l)$ ,即$2*(a_i + a_k - a_j -a_l)$ 第二步我们考虑如何选择这四个数能使得结果最大。 很明显我们需要尽可能让 较大的两个数$a_i,a_k$...
Codeforces Round 929 (Div. 3)
题目链接 A. Turtle Puzzle: Rearrange and Negate题意有一个长度为n的数组a,进行两步操作,第一步重新排列数组内元素的顺序, 第二部选择一个连续区间,将其中的元素取反。问进行完这两步操作后,数组元素的值的总和 最大是多少。 思路 很显然,把所有的负数放到一起,然后把这段区间取反即可。答案就是所有数的绝对值的和。 代码1234567891011121314151617181920212223242526#include<bits/stdc++.h>using namespace std;#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);#define int long long#define rep(i,l,r) for(int i = l;i<=r;i++)#define per(i,r,l) for(int i = r;i>=l;i--)const int INF = 0x3f3f3f3f3f3f3f3f;typedef...
Educational Codeforces Round 157
Educational Codeforces Round 161 (Rated for Div. 2) C. Closest Cities题意有n个城市, 他们分别在坐标轴上的点$a_1,a_2…,a_n$ ,我们定义从城市i到城市j之间的花费的金币为: 如果 $j$是$i$的最近城市,那么花费1个金币 否则花费 $|a_j - a_i|$ 个金币 现在给出一些询问,需要你回答从$x_i$号城市到 $y_i$号城市之间的花费的最少金币 思路首先我们知道:一个城市的最近城市 一定是和他相邻的两个城市中的一个。 因此我们根据贪心思想可以知道, 如果我们要从第i个城市到第j个城市, 那么我们将中间的城市全部依次经过一遍是最优的(因为经过的话就有可能只花费1金币) 于是本题就转换为了区间和的问题,可以用前缀和来解决: 当$x<y$时,我们使用一个数组$nxtcost$来记录从i到i+1花费的金币, 如果i+1是i的最近城市,那么$nxtcost[i] = 1$, 否则$nxtcost[i] = a_{i+1} - a_i$ , 那么从x到y的金币花费就是...
蓝桥杯python语法速通
Python 语法python代码有严格的缩进限制,不同的缩进代表了不同的含义,请不要随意缩进!!! 变量类型python不需要 预先声明变量,并且没有显式的类型声明,python 代码最后不需要加分号 12345a = b = c = 1 # 把 a , b , c 都赋值为1d,e,f = 777 , 3.14159 , "eeee" # 把d赋值为777, e赋值为小数3.14159 , f赋值为字符串“eee" 数字 数字类型的变量理论上可以存储无限大的数,但是会受限于计算机的运算速度。 str(字符串类型) 不论双引号"ABC",还是单引号 ‘ABC’ ,代表的都是字符串(即使是'a' ,也是长度为一的字符串,而不是字符) 列表(list) 列表使用中括号表示。 类似于C中的数组,能够存储一些数据,支持按下标找值。列表中可以存放任何类型,并且单个列表可以存放多种类型 12345678a = [0,[1,2,2,5],[[1]] ]# a[0] = 0#...
2023ICPC网络赛第二场
The 2023 ICPC Asia Regionals Online Contest (2) (pintia.cn) K Super-knight题意有一个士兵,起初在n*n的棋盘的左下角,每次向右移动a格,向上移动b格,当越过地图边界时,则到地图的另一边(类似于没有边界墙的贪吃蛇),对这个士兵能到达的格子做标记,所有被标记的格子中,离左下角格子最近的距离是多少。(假设最近的格子为$(x, y)$,就输出$(x - 1)^2+(y - 1)^2$ ) ( $2 \le n \le 10^{18}, 1 \le a,b \le 200$) 思路可以得出,在经过n次移动后,一定回回到起始点,所以最终的路径一定是循环的。 但n太大,无法通过这样判断所有的被标记的点。 可以发现,在移动了若干次后,除非穿过地图边界,否则只会增加 与原点的距离。因此我们只需要考虑刚穿过地图边界的点...
Educational Codeforces Round 157 (Rated for Div. 2)
Dashboard - Educational Codeforces Round 157 (Rated for Div. 2) - Codeforces C. Smilo and Monsters题意有n头怪物,每个怪物有各自的血量。每次操作可以 对一个怪物造成一点伤害,并令连击值x加一。 消耗所有的连击值x,选择一个生命值大于等于x的怪物,对他造成x点伤害,然后连击值降为0。 问最少多少操作能够杀死所有的怪物? 思路方案一、模拟 由于我们连击值越高,效益越大。所以先对怪物的血量由低到高排序,然后在血量较低的怪物身上使用普攻,然后当连击值和当前血量最高的怪物相等时,使用绝招杀死怪物。因此我们需要用l,r两个变量来记录当前普攻杀到了哪个怪物,以及大招该杀哪个怪物。 需要特判的是:可能普攻杀死一个最小的怪物时,连击值已经超过了最大血量怪物需要的连击值。这时候需要回退一些普攻操作。例如当前连击值为4,然后用6次普攻杀死了一个血量为6的小怪,但是另一只大怪的血量只有6,我们应该对小怪只造成2点普攻伤害,然后直接杀死大怪。(反例为 4 6 6 6...
Codeforces Round 906 (Div. 2)
Dashboard - Codeforces Round 906 (Div. 2) - Codeforces C. Qingshan Loves Strings 2题意给出一个n长的01串($1 \le n \le 100$),每次操作向串中插入一个”01“(最多可以插入300次),问如何插入能够使得最终的串满足:对于任何$0\le i < len$ 都有$str[i] \not= str[len-1-i]$ 。 如果有合理的方案,则输出方案,否则输出-1。 思路首先考虑特判,每次插入”01“ 不会改变0和1的数量关系, 而最终的串要求0和1的数量一样多。所以最初的0和1的数量也需要一样多。 然后考虑如下插入策略:由两边向中间靠拢,逐个检查每个字符。为了方便起见,我们使用$l$和$r$来代表待检查的左右字符的下标, 如果$str[l] \not= str[r]$ 则令 $l$++,$r$—, 如果$str[l] = str[r]$ ,则代表我们需要插入”01“串来干预。如果$str[l] = str[r] = ‘0’$ 那么就在第r+1位置插入”01“...
2023年10月ZZUACM实验室招新赛题解
注意事项请注意!: 题解仅代表个人看法,不代表最优解 每道题都会附上ac代码,但是仅作参考,要看懂后再了解代码。补题不要直接抄代码!禁止自欺欺人! 只提供题解,不提供题目信息 ac代码为C++版本,如果遇到不懂的语法请自行百度 ac代码中的循环经常用到了for(int i = 1;i<=n;i++) ,这种在for的括号中int i的操作只有大于等于C++11标准才可以使用,编译错误时请检查自己编译使用的标准。 A.数位分解对于一个数x, 使用 x % 10 (% 是取余数) ,就可以得到他的最后一位 使用 x /= 10 (除以十并取整数),就可以舍掉他的最后一位 使用while(x) 来进行循环 1234567891011#include<iostream>using namespace std;int main(){ int x; cin>>x; while(x){ cout<< x % 10 <<" "; x = x / 10; } return...
Codeforces Round 904 (Div. 2)
Dashboard - Codeforces Round 904 (Div. 2) - Codeforces C. Medium Design题意给长度为m的数组a,初始均为0。$1\le m \le 10^9$ 给出一些区间,请你选出其中某些区间。每选择一个区间,就令区间中的数都加一,问 数组中最大值$max(a)$ ,和最小值$ min(a)$ 的差,最大为多少。 思路考虑以下贪心策略:如果我们确定了最终第$i$个数是最大的那个数,即$ a[i] = max(a)$ , 那么我们就可以选择所有的包含$i$的区间。然后摒弃所有不包含$i$的区间。(选上包含$i$的区间一定会令$max(a)++$) , 这样我们可以遍历所有的数组下标$i$。 计算假使$i$为最大数时的$ans$,最终选择最大的$ans$即可。 我们可以先对区间进行排序。 然后根据右端点从小到大维护优先队列$pq$。这样按顺序遍历区间数组,就可以引入所有左端点小于等于$ i $的区间。然后通过剔除优先队列中的右端点小于i的区间。 这样优先队列中就保存了所有的包含$i$的区间。 因此有 $max(a) =...
招新赛题解
注意事项请注意!: 题解仅代表个人看法,不代表最优解 每道题都会附上ac代码,但是仅作参考,要看懂后再了解代码。补题不要直接抄代码!禁止自欺欺人! 只提供题解,不提供题目信息 ac代码为C++版本,如果遇到不懂的语法请自行百度 ac代码中的循环经常用到了for(int i = 1;i<=n;i++) ,这种在for的括号中int i的操作只有大于等于C++11标准才可以使用,编译错误时请检查自己编译使用的标准。 A.数位分解对于一个数x, 使用 x % 10 (% 是取余数) ,就可以得到他的最后一位 使用 x /= 10 (除以十并取整数),就可以舍掉他的最后一位 使用while(x) 来进行循环 1234567891011#include<iostream>using namespace std;int main(){ int x; cin>>x; while(x){ cout<< x % 10 <<" "; x = x / 10; } return...