首页 > 其他分享 >2022.9.16———HZOI【CSP-S开小灶5】游寄

2022.9.16———HZOI【CSP-S开小灶5】游寄

时间:2022-09-23 08:22:34浏览次数:64  
标签:16 mid long re 怪物 开小灶 NULL CSP define

\(Preface\)

\(Rank46/41\)

\(15pts + 30pts = 45pts\)

\(\mathfrak{T1}\ 乌鸦喝水\)

这个题的题意太坑人了,说的根本不清楚,样例也水,导致我挂成这弔样

他的意思是,乌鸦一共飞\(m\)回合,遇到能喝的就喝,喝了一次之后每个水缸的水位都要下降

直接爆扫有\(25pts\),及时\(break\)有\(55pts\),用链表优化爆扫有\(95pts\)

不是你这区分度也太差了吧

正解是树状数组,但是我没写

我去写了迪神的暴力\(dp\),加点优化,没有水的水缸就不要了,这样可以卡过。感觉和链表差不多,不清楚为什么这个可以过,可能与内存访问连续有关

T1
#include <iostream>
#include <cmath>
#define GMY (520&1314)
#define FBI_OPENTHEDOOR(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
#define re register int
#define char_phi signed
#define MARK cout << "###"
#define MARKER "@@@"
#define LMARK "!!!~~~"
#define ZY " qwq "
#define _ ' '
#define Endl cout << '\n'
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define N 100005
using namespace std;
inline void Fastio_setup(){ios::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL), cerr.tie(NULL);}
/*
	二度理解错题意 
*/
int n, m, final_ans, mxd;
int w[N], a[N];
void work(){
	cin >> n >> m >> mxd;
	for (re i = 1 ; i <= n ; ++ i)
		cin >> w[i];
	for (re i = 1 ; i <= n ; ++ i)
		cin >> a[i];
	for (re i = 1 ; i <= n ; ++ i)
		w[i] = ceil((double)(mxd - w[i] + 1) / a[i]);
	/*for (re i = 1 ; i <= n ; ++ i)
		cerr << w[i] << _;
	cerr << '\n';*/
	for (re i = 1 ; i <= m ; ++ i){
		for (re j = 1 ; j <= n ; ++ j){
			// cerr << i << _ << j << '\n';
			if (w[j] <= 0){
				continue;
			}
			for (re k = 1 ; k <= n ; ++ k)
				w[k] --;
			final_ans ++;
		}
	}
	cout << final_ans << '\n';
}
// #define IXINGMY
char_phi main(){
    #ifdef IXINGMY
        FBI_OPENTHEDOOR(a);
    #endif
    Fastio_setup();
    work();
    return GMY;
}

\(\mathfrak{T2}\ kill\)

首先需要明白一件事情:这\(n\)个人打的怪物在\(q\)数组中的下标是连续的。而且哪个人打哪个怪物,也就是打怪物的相对顺序,与人的相对顺序是相同的。比如第一个人打选出来的第一个怪物,第二个人打选出来的第二个怪物...

这个东西,我小证明一下,可能并不严谨

比如\(n=4\),\(m=5\)有:

1 2 3 \(\mathfrak{4}\) 5 6 7 8 9

其中粗体是怪物,斜体是人,又粗又斜的是人和怪物重合了,那个十分突出的是任务交付点

显然要打第\(2 \sim 4\)个怪物。假如说第一个人去打第一个怪物,显然是比 第一个人打怪物\(2\),第二个人打怪物\(3\).... 更劣的。

如果你说:“假如任务交付点左边只有一个怪物,而且在人\(1\)的左边呢?”

这个时候方案就变了呗。不可否认的是,选的怪物还是连续的。这个性质用于一会的『枚举起点』。

这个时候“哪个人打哪个怪物,也就是打怪物的相对顺序,与人的相对顺序是相同的。”就不证自明了。这个性质用于一会的『判断距离』。

然后考虑如何求解答案。

首先把\(p\)数组和\(q\)数组升序\(sort\)一下,因为他读入并没有保证有单调性。

因为问的是最晚的人所需时间,所以考虑二分最晚所需时间。

考虑\(check\)函数怎么写。

由于选择的怪物在\(q\)数组中的下标是连续的,所以我们只需要枚举第一个位置是谁,然后向后延伸\(n\)长判断是否打怪所需距离大于\(mid\)即可。

T2
#include <iostream>
#include <algorithm>
#define GMY (520&1314)
#define FBI_OPENTHEDOOR(x) freopen(#x ".in", "r", stdin), freopen(#x ".out", "w", stdout);
#define re register int
#define char_phi signed
#define MARK cout << "###"
#define MARKER "@@@"
#define LMARK "!!!~~~"
#define ZY " qwq "
#define _ ' '
#define Endl cout << '\n'
#define MIN(x, y) (((x) < (y)) ? (x) : (y))
#define MAX(x, y) (((x) > (y)) ? (x) : (y))
#define ABS(x) (((x) < 0) ? (-(x)) : (x))
#define N 5005
using namespace std;
inline void Fastio_setup(){ios::sync_with_stdio(false); cin.tie(NULL), cout.tie(NULL), cerr.tie(NULL);}
long long n, m, endplc, final_ans;
long long a[N], b[N];
inline char check(long long mid){
	int x = 1;
	for (re i = 1 ; i <= n ; ++ i, ++ x){
		while (x <= m and ABS(a[i]-b[x])+ABS(b[x]-endplc) > mid)
			x ++;
		if (x > m)
			return false;
	}
	return true;
}
void work(){
	cin >> n >> m >> endplc;
	for (re i = 1 ; i <= n ; ++ i)
		cin >> a[i];
	for (re i = 1 ; i <= m ; ++ i)
		cin >> b[i];
	sort(a+1, a+n+1); sort(b+1, b+m+1);
	long long LF(0), RT(1000000002), mid;
	while (LF <= RT){
		mid = (LF + RT) >> 1;
		if (check(mid) == true)
			RT = mid - 1, final_ans = mid;
		else 
			LF = mid + 1;
	}
	cout << final_ans << '\n';
}
// #define IXINGMY
char_phi main(){
    #ifdef IXINGMY
        FBI_OPENTHEDOOR(a);
    #endif
    Fastio_setup();
    work();
    return GMY;
}

标签:16,mid,long,re,怪物,开小灶,NULL,CSP,define
From: https://www.cnblogs.com/charphi/p/16721452.html

相关文章

  • 「游记」CSP 2022
    9.05+模拟赛日常考不过暴力老哥。天天挂分。烦死了。感觉人要没。9.16坑。9.18初赛。没报J组。S组完善程序中“归并第\(k\)小”的程序完全没看懂,于是填了\(5\)......
  • 2022.9.15———HZOI【CSP-S开小灶4】游寄
    Preface\(Rank31/39\)\(20pts+0pts=20pts\)最近出现了暴力不会打的情况我震惊我tm暴力不会打?然后其实仔细思考也是可以打的。只要暴力不是\(dp\)。但是赛时我老......
  • CSP - S2022笔试游寄
    时隔多天,我们仍未忘记那曾被$€€£$垃圾后台支配的恐惧Day-0.5我们下午考,上午\(J\)组的考试占了机房,就把我们赶去了微机教室,老机子,编译都得半天....于是闲的蛋疼就......
  • P2822 [NOIP2016 提高组] 组合数问题
    P2822[NOIP2016提高组]组合数问题题解作者岛田小雅这是一道复杂度非常容易爆炸的问题。我看到这题的第一眼,第一反应是直接按照公式暴力跑。我们看一眼数据范围。如......
  • 字典树-2416. 字符串的前缀分数和
    问题描述给你一个长度为n的数组words,该数组由非空字符串组成。定义字符串word的分数等于以word作为前缀的words[i]的数目。例如,如果words=["a","ab......
  • CSP 2022 备战 贪心算法
    基本思路:1.建立数学模型来描述问题2.把求解的问题分成若干个子问题3.对每一子问题求解,得到子问题的局部最优解4.把子问题的局部最优解合并成一个解贪心的使用前提:局部......
  • 2022.9.13———HZOI【CSP-S模拟5】游寄
    \(Preface\)\(Rank38/43\)\(30pts+0pts+30pts+0pts=60pts\)分好低。。\(\mathfrak{T1}\F\)mad场切题我又没切枚举。没错,枚举。但是我枚举的太多了,显然的枚举......
  • 2022.9.12———HZOI【CPS-S开小灶3】游寄
    \(Preface\)\(Rank35/41\)\(80pts+0pts=80pts\)蒻爆了\(\mathfrak{T1}\世界冰球锦标赛\)这就是我在这里说的那个更板的题,全场就我一个人打记搜,别人没\(A\)都是写......
  • 9.16-17四则运算2
     packagetemomomomo;importjava.util.Random;importjava.util.Scanner;publicclasssizeyunsuan2{  staticScannerin=newScanner(System.in);//一定要......
  • 2022.9.12———HZOI【CSP-S模拟4】游寄
    \(Preface\)\(Rank32/43\)\(0pts+40pts+40pts+20pts=100pts\)\[\Huge\mathbf{水博客警告}\]\(\mathfrak{T1}\石子游戏\)\(mad\)上来一个博弈论呼我脸上,这......