Codeforces Round #643 (Div. 2)(C ~ E)
C. Count Triangles
题目链接 :
https://codeforces.com/contest/1355/problem/C
题目大意 :
给你 A , B , C , D
问有多少种方法构造出三角形(X , Y , Z)使得 A ≤ X ≤ B ≤ Y ≤ C ≤ Z ≤ D
解题思路 :
假设我们有了 (X + Y) 的长度时(记 X + Y = i )
根据三角形两边之和大于第三边的性质 Z 的取值范围我们也能确定了
再根据题意 B <= Y <= C , 我们又能得到 X 的取值范围(即构成 X + Y = i 的方案数)
于是答案 ans += (Z的取值范围 * X的取值范围)
而我们已知 A ≤ X ≤ B ≤ Y ≤ C ≤ Z ≤ D 且 (X , Y , Z) 可构成三角形,那么 X + Y 的可取范围也就已知
所以我们可以通过枚举 X + Y 的长度来操作
AC_Code :
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
ios::sync_with_stdio(false);
int a , b , c , d , ans = ;
cin >> a >> b >> c >> d;
for(int i = c + ; i <= c + d ; i ++)
{
int l = max(a , i - c);
int r = min(b , i - b);
if(r < l) continue;
ans += (r - l + ) * (min(d + , i) - c);
}
cout << ans << '\n';
return ;
}
D. Game With Array
题目链接 :
https://codeforces.com/contest/1355/problem/D
题目大意 :
问你能否构造一个长度为 N 且和为 S 的序列
使得对于该序列你无法找到一个子序列使得子序列的和等于 K 或 S - K (0 <= K <= S)
解题思路 :
猜结论
我们构造一个前 N - 1项为 1,第 N 项为 S - N + 1 的序列
对于前 N - 1项构成的序列的和我们设为 K,那么第 N 项构成的序列和就为 S - K
这样就很好的使用上了题目给的信息,所以盲猜该构造方法是可行的
那么对于该序列,[ 1 , N - 1 ] 和 [ S - (N - 1) , S ] 的值我们都是可以通过选取子序列得到
而 [ N , S - N ] 的值无法得到,所以只要判断 N 是否小于等于 S - N 即可
AC_Code :
#include<bits/stdc++.h>
using namespace std;
signed main()
{
ios::sync_with_stdio(false);
int n , s;
cin >> n >> s ;
int ans = s - n;
if(ans >= n)
{
cout << "YES" << '\n';
for(int i = ; i <= n - ; i ++) cout << "1 ";
cout << ans + << '\n' << n << '\n';
}
else cout << "NO\n";
return ;
}
E. Restorer Distance
题目链接 :
https://codeforces.com/contest/1355/problem/E
题目大意 :
给你一个长度为 N 的序列 H 和三种操作
①、任选一个 Hi 使得 Hi = Hi + 1,代价为 A
②、任选一个 Hi 使得 Hi = Hi - 1,代价为 R
③、任选一个 Hi、Hj 使得 Hi = Hi + 1 , Hj = Hj - 1 ,代价为 M
现要使整个序列的数的值都相同,问需要花费的最小代价为多少
解题思路 :
操作③ = 操作① + 操作②,如果 A + R <= M,那么对于操作③我们只要用操作① + ②代替即可
因为最后整个序列的值都相同(我们记最后的值为 X),那么暴力的做法就是枚举 X 然后选择最小代价
显然暴力的做法复杂度是不行的
但是通过枚举我们会发现 , 在 X 的可行域内 F(X) 呈一种单峰函数(F(X)指最后序列值全为 X 的最小代价)
得到了这些信息后这道题就是道三分的裸题了
AC_Code :
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 3e5 + ;
int h[N] , n , a , r , m , ans = 1e18;
int check(int mid)
{
int res = , sum1 = , sum2 = ;
if(a + r <= m)
{
for(int i = ; i <= n ; i ++)
if(h[i] >= mid) res += (h[i] - mid) * r;
else res += (mid - h[i]) * a;
return res;
}
for(int i = ; i <= n ; i ++)
if(h[i] >= mid) sum1 += h[i] - mid;
else sum2 += mid - h[i];
res += min(sum1 , sum2) * m;
if(sum1 > sum2) res += (sum1 - sum2) * r;
else res += (sum2 - sum1) * a;
return res;
}
signed main()
{
ios::sync_with_stdio(false);
cin >> n >> a >> r >> m;
for(int i = ; i <= n ; i ++) cin >> h[i];
int L = , R = 1e9;
while(R - L > )
{
int midl = L + (R - L) / , midr = R - (R - L) / ;
if(check(midl) < check(midr)) R = midr;
else L = midl;
}
for(int i = L ; i <= R ; i ++) ans = min(ans , check(i));
cout << ans << '\n' ;
return ;
}
Codeforces Round #643 (Div. 2)(C ~ E)的更多相关文章
- Codeforces Round #643 (Div. 2) 题解 (ABCDE)
目录 A. Sequence with Digits B. Young Explorers C. Count Triangles D. Game With Array E. Restorer Dist ...
- Codeforces Round #643 (Div.2)
前言:这套cf我感觉出的很不错,AB就不说了,唯一有点欠缺的就是C和D的位置应该换一下,C出的挺不错,反正我当时没有想出来(赛后补题的时候其实也不难..听朋友说还可以FFT优化,然而我是个图论手并不会 ...
- Codeforces Round #643 (Div. 2) B. Young Explorers (思维,贪心)
题意:给你一组人\(a\),现在要将这些人进行分组,对于\(i\),只有某一组的人数\(\ge a_{i}\)时,\(i\)才可以加入这个组,问最多能够有多少组,(不必将所有人都选用). 题解:我们将 ...
- Codeforces Round #643 (Div. 2) E. Restorer Distance (贪心,三分)
题意:给你\(n\)个数,每次可以使某个数++,--,或使某个数--另一个++,分别消耗\(a,r,m\).求使所有数相同最少的消耗. 题解:因为答案不是单调的,所以不能二分,但不难发现,答案只有一个 ...
- Codeforces Round #643 (Div. 2) C. Count Triangles (数学公式)
题意:给你四个正整数\(A,B,C,D\),且\(A\le B\le C \le D\),有\(A\le x\le B\le y\le C \le z\le D\),求最多有多少组\((x,y,z)\ ...
- Codeforces Round #643 (Div. 2) D. Game With Array (思维,构造)
题意:给你两个正整数\(N\)和\(S\),构造一个长度为\(N\)并且所有元素和为\(S\)的正整数数组,问是否能找到一个\(K (0\le K \le S)\)使得这个数组的任意_子数组_的和都不 ...
- Codeforces Round #366 (Div. 2) ABC
Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 #I hate that I love that I hate ...
- Codeforces Round #354 (Div. 2) ABCD
Codeforces Round #354 (Div. 2) Problems # Name A Nicholas and Permutation standard input/out ...
- Codeforces Round #368 (Div. 2)
直达–>Codeforces Round #368 (Div. 2) A Brain’s Photos 给你一个NxM的矩阵,一个字母代表一种颜色,如果有”C”,”M”,”Y”三种中任意一种就输 ...
随机推荐
- C# WCF 之优势及特性
Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windows通讯的 . ...
- pysparnn 模块使用,相似句子召回
import pysparnn.cluster_index as ci from sklearn.feature_extraction.text import TfidfVectorizer data ...
- [Abp vNext 入坑分享] - 前言
一·背景 Abp vnext是 ABP 框架作者所发起一个完全基于 ASP .NET Core框架,截至2020年4月份已经升级到2.5.0版本,根据经验2.0版本以后可以放心的使用在生产环境.类似a ...
- <vector>常用操作
如果不清楚vector是什么的话就去看我的另一篇随笔吧:https://www.cnblogs.com/buanxu/p/12791785.html 进入正题,vector和string一样,也是一种 ...
- NPM 私有仓库的搭建
NPM 私有仓库的搭建 为什么搭建私有仓库 balabala,当然是有需求的时候嘛 搭建流程 介绍和安装verdaccio 备注: 程序启动后,配置文件为/home/work/.config/verd ...
- Micropython教程之TPYBoard开发板驱动舵机教程(萝卜学科编程教育)
大家应该都看到过机器人的手臂啊腿脚啊什么的一抽一抽的在动弹吧...是不是和机械舞一样的有节奏,现在很多机器人模型里面的动力器件都是舵机. 但是大家一般见到的动力器件都是像步进电机,直流电机这一类的动力 ...
- Crash日志解析
当应用程序崩溃时,会创建一个崩溃报告,这对于了解导致崩溃的原因非常有用.本文档包含有关如何表示,理解和解释崩溃报告的基本信息. 1.介绍 2.获取崩溃和低内存报告 3.象征性的奔溃报告 1.位码(bi ...
- 业务SQL那些事--慎用LIMIT
业务SQL那些事--慎用LIMIT 在业务中使用LIMIT限制SQL返回行数是很常见的事情,但如果不知道其中可能的坑或者说真正执行逻辑,就可能会使SQL执行非常慢,严重影响性能. LIMIT OFFS ...
- Linux常用的安全加固
一.账号和口令 1.1 禁用或删除无用账号 减少系统无用账号,降低安全风险. 操作步骤userdel <用户名> //删除不必要的账号.passwd -l <用户名> //锁定 ...
- golang之array
golang使用array表示固定大小的数组,使用slice表示动态数组. package main import "fmt" func main() { var a = [5]i ...