首页 > 其他分享 >[35] (CSP 集训) CSP-S 模拟 5

[35] (CSP 集训) CSP-S 模拟 5

时间:2024-09-27 11:52:08浏览次数:1  
标签:lfloor frac int rfloor 集训 ge 35 CSP

T1 光

Hikari

好神秘这个题,我觉得我解法够神秘了结果是正解

考虑到这四个数虽然不能二分答案,但是它们的和是能二分答案的

因此对和做二分答案

然后问题变成了 check 怎么写

设和最小的答案为 \((i_1,i_2,i_3,i_4)\)

注意到 \(n\) 只有 \(1500\),考虑直接 \(n^2\) 枚举前两个数

那么后面俩咋办

注意到可以令 \(i_4=sum-i_1-i_2-i_3\)

把题目里的四个限制移项,移项之后等式左边还剩四组

\(i_3+\lfloor\frac{i_4}{2}\rfloor\ge\) 一坨常数

\(i_4+\lfloor\frac{i_3}{2}\rfloor\ge\) 一坨常数

\(\lfloor\frac{i_3}{2}\rfloor+\lfloor\frac{i_4}{4}\rfloor\ge\) 一坨常数

\(\lfloor\frac{i_4}{2}\rfloor+\lfloor\frac{i_3}{4}\rfloor\ge\) 一坨常数

对于前两组,发现当 \(i_3\) 增大的时候,第一组的值增大,第二组的值减小

说明还是有单调性,继续对 \(i_3\) 二分答案。

后面两组没办法了,因为挂 floor,只能说看起来和前面两组差不多,其实并不是单调的,可以自己试试

所以充分发扬人类智慧,先判前两组限制,前两组过了说明离答案非常近了,所以直接在答案区间左右 \(d\) 的范围内暴力 check 是否合法,合法直接返回,\(d\) 取的 \(8\),因为分母是 \(4\)

最坏复杂度 \(n^2\log(4n)\log(n+8)\) 不知道为啥这么快

非常卡常,记得常数优化

#include<bits/stdc++.h>
using namespace std;
int a,b,c,d;
//判断 (i1,i2,i3,i4) 是否合法
inline int check(int i1,int i2,int i3,int i4){
	if(i3+(i4/2)<c-(i1/2)-(i2/4)){
		return 1;//i3 小了
	}
	if(i4+(i3/2)<d-(i1/4)-(i2/2)){
		return -1;//i3 大了
	}
	if((i3/2)+(i4/4)<a-i1-(i2/2)){
		return 0;//接神秘做法
	}
	if((i4/2)+(i3/4)<b-i2-(i1/2)){
		return 0;
	}
	return 2;//正好是对的
}
//二分答案 i3
inline bool checksum2(int sum,int i1,int i2){
	int remain=sum-i1-i2;
	int l=0,r=remain;
	while(l<=r){
		int i3=(l+r)/2;
		int i4=remain-i3;
		int res=check(i1,i2,i3,i4);
		if(res==2) return true;
		if(res==1){
			l=i3+1;
		}
		if(res==-1){
			r=i3-1;
		}
		if(res==0){
			for(int i=max(0,i3-8);i<=min(remain,i3+8);++i){
                //暴力
				if(check(i1,i2,i,remain-i)==2){
					return true;
				}
			}
			return false;
		}
	}
	return false;
}
//二分答案 sum 的 check() 函数
inline bool checksum(int sum){
	for(int i1=0;i1<=sum;++i1){
		for(int i2=0;i2<=sum-i1;++i2){
			if(i1==114 and i2==22){
			}
			if(checksum2(sum,i1,i2)){
				return true;
			}
		}
	}
	return false;
}
signed main(){
//	freopen("test.in","r",stdin);
//	freopen("test.out","w",stdout);
	freopen("light.in","r",stdin);
	freopen("light.out","w",stdout);
	scanf("%d %d %d %d",&a,&b,&c,&d);
	int l=0,r=a+b+c+d,ans=-1;
//二分答案 sum
	while(l<=r){
		int mid=(l+r)/2;
		if(checksum(mid)){
			r=mid-1;
			ans=mid;
		}
		else{
			l=mid+1;
		}
	}
	cout<<ans<<'\n';
}
/*
50 24 25 12
*/

标签:lfloor,frac,int,rfloor,集训,ge,35,CSP
From: https://www.cnblogs.com/HaneDaCafe/p/18435376

相关文章

  • 字节员工:35岁以后被裁员的,后来都走了哪条路?现在2-2,要不要利用最后一年拼命上个岸。
    大家好,我是八哥。最近有没有被《凡人歌》这部剧刷屏?故事围绕三对北漂伴侣展开,聚焦真实职场生活。特别是剧中的“卷王代表”那隽,更是成为打工人热议的焦点。程序员那隽,出身贫寒,一路拼搏,最终拥有100万年薪,2000万期权,还住进了160平的北京豪宅。这个被同事称为“那神”的角色,不......
  • 关于科技特长生 家长与孩子需知 20240926_232535
    初识科技特长生什么是科技特长生为什么科技特长生火成为科技特长生的优势高中升大学特招赛道如何成为科技特长生......
  • ETL: 学习搭配PENTAHO-SERVER-CE-9.4.0.0-343 + MYSQL8.0.35 部分错误日志
     学习搭配PENTAHO-SERVER-CE-9.4.0.0-343+ MYSQL8.0.35 ,启动PENTAHO 后,日志显示:UsingCATALINA_BASE:"E:\Programs\pentaho-server\tomcat"UsingCATALINA_HOME:"E:\Programs\pentaho-server\tomcat"UsingCATALINA_TMPDIR:"E:\Programs......
  • 【刷题笔记】2019 CSP-J
    2019CSP-J题目整理B-公交换乘思路梳理先想暴力算法,一遇到公交车,就在已出现过的优惠卷中寻找价格大于等于公交车票价,并且出现时间最早且没有用过的优惠卷,时间复杂度为\(O(n^2)\),必然会炸。但是注意题目中给到的特殊性质,要求如果优惠卷有效,则\[t_{bus}-t_{subway}\le45\]并......
  • javase复习day35反射
    反射获取class对象的方法 publicclassDemo1{publicstaticvoidmain(String[]args)throwsClassNotFoundException{//获取反射的三种方式//第一种Class.forName(全类名)//用法:最为常用Class<?>clazz1=Class.forNam......
  • CSP 模拟 33
    A商品对于一个数对\((x,y)[x<y]\),无论怎样选择区间,这个数对的贡献都是\(y-x\),那么考虑对于所有数对,把\(x\)和\(y\)分别放到一起,排好序。如果当前区间确定,在两个数组二分一下,前缀和就能处理出答案。显然区间越大越好,所以只考虑区间左端点,考虑只对于点对\((x,y)\)来说,\(l......
  • 文心一言 VS 讯飞星火 VS chatgpt (355)-- 算法导论24.2 1题
    一、请在图24-5上运行DAG-SHORTEST-PATHS,使用结点r作为源结点。如果要写代码,请用go语言。文心一言:在Go语言中实现一个DAG(有向无环图)上的最短路径算法(例如,DAG-SHORTEST-PATHS,这通常可以通过简单的拓扑排序加动态规划或者简单的迭代方法来实现,因为DAG中没有环)并不复杂。但......
  • 信息学奥赛复赛复习04-CSP-J2019-04-加工零件-位运算、整数映射0或1、结构体、初始化
    PDF文档回复:20240926<12019CSP-J题目4加工零件[题目描述]凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有n位工人,工人们从1∼n编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带如果......
  • CSP模拟3
    T1奇观挺有趣的思路,每个字母相互独立,\(C\)和\(F\),我们可以把\(C\)分成一个两个端点和一个三个端点的路径(以同一个起点开始),而\(F\)为了方便统计,我们也可以把它分成两个两个端点和一个三个端点的路径(同样是以同一个端点为起点)。那我们定义$s_{i}=\sum_{j}[(i,j)双向......
  • 信息学奥赛复赛复习04-CSP-J2019-04-加工零件-位运算、整数映射0或1、结构体、初始化
    PDF文档公众号回复关键字:2024092612019CSP-J题目4加工零件[题目描述]凯凯的工厂正在有条不紊地生产一种神奇的零件,神奇的零件的生产过程自然也很神奇。工厂里有n位工人,工人们从1∼n编号。某些工人之间存在双向的零件传送带。保证每两名工人之间最多只存在一条传送带......