首页 > 其他分享 >24号个人赛

24号个人赛

时间:2023-07-24 19:12:34浏览次数:41  
标签:24 10 13 idx int long 个人赛 序列

个人赛链接: https://www.luogu.com.cn/contest/120468#description



A.faebdc玩扑克

解题思路

本题涉及约瑟夫环问题, 约瑟夫环就是n个人围成一个圈从1开始挨个报数, 设间隔m, 报到m这个数的那个人出局, 然后他的下一个个重新从1开始报, 直到场上只剩下一个人; 按出局的先后输出序列;
本题的间隔m为2; 并且属于是约瑟夫环的逆运算, 约瑟夫环是给定原序列, 求出局序列; 本题是给定出局序列, 求原序列; 这个地方有点绕, 认真思考一下, 以n = 13为例: 出局序列就是 1 2 3 4 5 6 7 8 9 10 11 12 13; 所求的原序列为 7 1 12 2 8 3 11 4 9 5 13 6 10; 对原序列进行约瑟夫环问题求解, 间隔m为2, 会发现结果就是 1~13;

设n= 13, 逆运算的求解思路为: 我们对原序列1 2 3 4 5 6 7 8 9 10 11 12 13以间隔m = 2求解约瑟夫环问题; 会得到出局序列为2 4 6 8 10 12 1 3 5 7 9 11 13; 注意原序列1~13并不是个的编号, 而是这个人所坐的位置; 我们对他求约瑟夫环问题是为了知道, 坐在第x个位置的人会是第几个出局的; 例如坐在第2个位置的人会是第1个出局的, 坐在第1个位置的人会是第7个出局的; 注意我们要求的出局序列是1~13; 1是第一个出局的, 所以要把编号为1的人放在第2个位置上, 同理, 要把编号为7的人放在第1个位置上; 这样我们就得到了原序列7 1 12 2 8 3 11 4 9 5 13 6 10;

神秘代码1

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e6 + 10, mod = 1e9 + 7;
int n, m, k, idx;
int r[N], f[N];
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n;
	int x = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= 2; j++) {
			x++;
			if (x > n) x = 1;
			if (r[x] != 0) j--;
		}
		r[x] = i;// 把编号为i的人放在第x个位置上
	}
	for (int i = 1; i <= n; i++) cout << r[i] << ' ';
	return 0;
}


下面这个代码思路和上面一样, 都是找到坐在第几个位置的人会是第几个出局的; 不过本代码是按照本题的题意进行模拟得到的, 上面的代码是用的约瑟夫环;

神秘代码2

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e6+ 10, mod = 1e9 + 7;
int n, m;
queue<int> q; 
deque<int> v;
int r[N];
signed main() {
	scanf("%lld", &n);
	for (int i = 1; i <= n; i++) q.push(i);
	int idx = 1;
	while (q.size()) {
		int t1 = q.front();
		q.push(t1);
		q.pop();
		int t2 = q.front();
		v.push_back(t2);
		q.pop();
	}
	for (int i = 1; i <= n; i++) {
		r[v.front()] = i;
		v.pop_front();
	}
	for (int i = 1; i <= n; i++) {
		printf("%lld ", r[i]);
	}
	return 0;
}




B.PLATFORME 平板

解题思路

这个题我看n只有100就想着直接暴力; 我们把所有平板按高度从大到小排序; 对于每个木板, 我们从高到低遍历所有比它低的木板, 看有没有能够承载它的木板; 由于本题的设定, 要对边界进行特殊处理; 如果有的话距离即为高度差, 然后打个标记, 表示这个平板的这条腿不用接地; 遍历完后, 再遍历一次所有平板, 如果又平板的某条腿没有标记, 就让他接地即可, 距离即为平板高度; 最后输出距离的总和;

神秘代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 500+ 10, mod = 1e9 + 7;
int n, m, k, idx;
struct stu {
	int a, b, c;
}ed[N];
bool cmp(stu a, stu b) {
	return a.a > b.a;
}
bool lt[N], rt[N];
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		ed[i] = { a,b,c };
	}
	sort(ed + 1, ed + 1 + n,cmp);
	int res = 0;
	for (int i = 1; i <= n; i++) {
		int x = ed[i].b, y = ed[i].c, z = ed[i].a;
		for (int j = i+1; j <= n; j++) {
			int l = ed[j].b, r = ed[j].c, h = ed[j].a;
			if (z <= h) continue;
			if (x >= l && x < r&&!lt[i]) {
				res = res + z - h;
				lt[i] = true;
			}
			if (y > l && y <= r&&!rt[i]) {
				res = res + z - h;
				rt[i] = true;
			}
		}
	}
	for (int i = 1; i <= n; i++) {
		if (!lt[i]) res += ed[i].a;
		if (!rt[i]) res += ed[i].a;
	}
	cout << res;
	return 0;
}




D.Best Spot S

解题思路

根据题意很容易就读出来是一个多源最短路问题; 用Floyd算法求出最短路后以每个牧场作为起点遍历所有喜欢的牧场得到多个总距离; 最后找到最小的那个即可;

神秘代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 500+ 10, mod = 1e9 + 7;
int n, m, k, idx;
vector<int> v;
int g[N][N];
void floyd() {
	for (int k = 1; k <= n; k++) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				g[i][j] = min(g[i][j], g[i][k]+g[k][j]);
			}
		}
	}
}
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> m >> k;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			if (i == j) g[i][j] = g[j][i] = 0;
			else g[i][j] = g[j][i] = 1e9;
		}
	}
	for (int i = 1; i <= m; i++) {
		int x;
		cin >> x;
		v.push_back(x);
	}
	for (int i = 1; i <= k; i++) {
		int a, b, c;
		cin >> a >> b >> c;
		g[a][b] = g[b][a] = min(g[a][b], c);
	}
	floyd();
	int minn = 1e9;
	int pos;
	for (int i = 1; i <= n; i++) {
		int res = 0;
		for (int x : v) {
			res += g[i][x];
		}
		if (res < minn) {
			pos = i;
			minn = res;
		}
	}
	cout << pos;
	return 0;
}




G.无穷的序列

解题思路

签到题, 根据累加求和的公式n*(n+1)/2; 用二分查找是否存在n满足该公式; 若有则为1, 否则为0;

神秘代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e6+ 10, mod = 1e9 + 7;
int n, m, idx;
vector<int> v; 
int check(int x) {
	x = x * (x + 1);
	if (x < m) return 1;
	else if (x > m) return 2;
	else if (x == m) return 3;
}
signed main() {
	scanf("%lld", &n);
	while (n--) {
		scanf("%lld", &m);
		bool f = false;
		if (m == 1) printf("1\n");
		else {
			m--;
			m = m * 2;
			int l = 1, r = 1e5;
			while (l < r) {
				int mid = l + r + 1>> 1;
				if (check(mid)==1) {
					l = mid+1;
				}
				else if(check(mid) == 2) r = mid - 1;
				else {
					f = true;
					break;
				}
			}
			if (f) printf("1\n");
			else {
				int x = l * (l + 1);
				if (x == m) printf("1\n");
				else printf("0\n");
			}
		}
	}
	return 0;
}




E.山峰暸望

解题思路

这个题的数据是不是太水了...1e8的复杂度竟然没有TLE, 本以为要用dp, 结果暴力就直接过了;
为什么还是用了暴力? dp不会呗...

神秘代码

//暴力做法
#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, pair<int, int>> PIP;
const int N = 1e4 + 10, mod = 1e9 + 7;
int n, m, idx;
vector<PIP> v;
int h[N];
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> h[i];
	}
	int maxn = 0;
	for (int i = 1; i <= n; i++) {
		int l = i, r = i;
		while (h[l - 1] <= h[l]&&l>1) l--;
		while (h[r + 1] <= h[r]&&r<n) r++;
		maxn = max(maxn, r - l + 1);
	}
	cout << maxn;
	return 0;
}




J.“非常男女”计划

解题思路

题意很简单, 不过我还是看了标签才知道要用前缀和...还得练啊; 不过既然知道要用前缀和, 我突然闪过一个想法, 不如把女生的0换成-1; 这样这个男女的平衡的话就前缀和就为0; 男女平衡一共有两个情况: 一是前缀和s[n]为0, 意思是从最开始到第n个人恰好是平衡的; 二是前缀和的差为0, 即s[n]-s[m]=0, 意思是从第m+1个人到第n个人是平衡的; 然后我们会发现如果要求n和m是O(n^2)的复杂度, 肯定是要优化的; 所以我们对第二种情况的优化策略为: s[n]-s[m]=0我们将其理解为是s[n]=s[m], 这样当我们遍历前缀和时, 如果s[i]=a; 那我们用map把当前的位置i存下来, 即mp[a]=i; 这样之后如果我们又遇到s[i]=a; 那么用当前的i - mp[a]就是一个男女平衡的序列长度;
至于为什么mp[a]不用更新,. 是因为i从小到大遍历, 如果要求最长的序列长度, 那mp[a]就要存最小的i, 也就是第一次s[i]=a时的i;

神秘代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5+ 10, mod = 1e9 + 7;
int n, m, k, idx;
int s[N], g[N];
map<int,int> mp;
signed main() {
	int n;
	cin >> n;
	int maxn = 0;
	for (int i = 1; i <= n; i++) {
		cin >> g[i];
		if (g[i] == 0) g[i] = -1;
		s[i] = s[i - 1] + g[i];
		if (s[i] == 0) {
			maxn = max(maxn, i);
			continue;
		}
		if (mp[s[i]]) {
			maxn = max(maxn, i - mp[s[i]]);
		}
		else mp[s[i]] = i;
	}
	cout << maxn;
	return 0;
}




K.Milk Scheduling S

解题思路

根据题意可以发现是一个关于拓扑排序的题; 而难点在于挤奶时间的累加; 对于没有入度的奶牛, 找出他们当中的最大值作为结果res的初始值; 对于有入度的奶牛, 我们可以用一个数组g1把他们原始的挤奶时间存起来; 在bfs过程中, 我们用他的挤奶时间g1[j]加上它父类的挤奶时间g[t]来更新当前奶牛的g[j], 如果有多个父类则找最大值; 然后当入度为0后用把g和结果res作比较, 结果取最大值; 接着再用g去更新其他子类奶牛的挤奶时间;

神秘代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int, int> PII;
const int N = 1e5+ 10, mod = 1e9 + 7;
int n, m, k, idx, res;
int g[N], h[N], e[N], ne[N], d[N];
int g1[N];
queue<int> q;
void add(int a, int b) {
	e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void bfs() {
	while (q.size()) {
		int t = q.front();
		res = max(res, g[t]);
		q.pop();
		for (int i = h[t]; i != -1; i = ne[i]) {
			int j = e[i];
			d[j]--;
			g[j] = max(g[j], g[t] + g1[j]);
			if (d[j] == 0) {
				q.push(j);
			}
		}
	}

}
signed main() {
	cin >> n >> m;
	memset(h, -1, sizeof h);
	for (int i = 1; i <= n; i++) {
		cin >> g[i];
	}
	for (int i = 1; i <= m; i++) {
		int a, b;
		cin >> a >> b;
		add(a, b);
		d[b]++;
	}
	for (int i = 1; i <= n; i++) {
		if (d[i] == 0) {
			q.push(i);
		}
		else {
			g1[i] = g[i];
		}
	}
	bfs();
	cout << res;
	return 0;
}

标签:24,10,13,idx,int,long,个人赛,序列
From: https://www.cnblogs.com/mostimali/p/17578081.html

相关文章

  • 7.24 后记
    T1惨案一:80pt代码忘交了正解:开个桶 cnt[0]++; for(inti=1;i<=n;i++){ for(intj=1;j<=tot;j++){ ans+=cnt[a[i]^v[j]]; cnt[a[i]]++; } }vis[]存因数T2考试时暴力挂了正解:选出的区间长度一定\(\le3\)线段树维护长度为\(2\)和长......
  • 23-7-24日干点啥
    1.整理文档,下载了一些大数据相关的pdf书籍2.删手机相册的照片,将有意义的照片整理到相册,扩大手机存储容量3.准备调整作息规划,晚上要早点睡才行,今天来公司下午一直瞌睡4.整理了百度网盘的资料,现在看起来不是很乱好多了5.在博客园写了第一条博客......
  • 7.24 day1数据结构
    day1数据结构考试整场比赛打完了,没用数据结构?!结果:100+30+40+30=200T1正解异或好性质,100000以下最多128个因数枚举每个右端点,将前缀异或塞进桶里,同时枚举因数,看有几个和自己对应的前缀异或,直接计数即可T2暴力要输出分数,考场实在没办法,用浮点数做01分数规划,最后枚举分母(只......
  • 20230724日报
    简单的求和做题原因之前TLE30和TLE60,一直没有做出来做题过程想到了尺取法,重新听了尺取法的课,看了尺取法的模板。看了之前错误的代码,决定沿用之前使用map的方法,但是在找不出之前的错误,重新写了一遍代码交上去AC解题思路首先输入的元素是不需要按照它本来的顺序的(可以重......
  • 海亮 7.24 水题选讲
    海亮7.24水题选讲TheMaximumPrefix我们设定一个状态\(f_{i,j}\)表示这个序列的\([i+1,n]\)区间的最大前缀和为\(j\),这个序列的期望得分。转移为\(f_{i,j}=f_{i-1,j+1}\timesp_i+f_{i-1,\max\left(j-1,0\right)}\times\left(1-p_i\right)\)。第一个整式表示第\(i\)......
  • 成语积累 20230724
    难兄难弟:nan4xiongnan4di:处于同样困境的人。(nan2:兄弟二人都非常好,难分高下。或讥讽两者同样低劣。出处:元方难为兄,季方难为弟。近义:难分伯仲)暴虎冯河:暴:通"虣",和老虎打斗;冯:通"淜",指无舟渡河。空手打虎,徒步过河。多用于比喻有勇无谋,冒险蛮干。也比喻勇猛果敢。例句:我原以为他......
  • CVE-2022-24481
    一、漏洞信息CVE-2022-24481是发生在CLFS驱动中的一个类型混淆漏洞,通过精巧的对blf文件的部分数据进行构造,可使LogBlockHeader中的ClientContextOffset指向ContainContext,从而造成类型混淆。二、测试环境及漏洞复现测试环境POC:4c1579c6a14bb8f3985be8a1a83c731c靶机:win10......
  • 7/24·morning
    问题A:铲雪车问题#include<bits/stdc++.h>usingnamespacestd;intmain(){longlongx,y;longlonga,b,c,d;doubles;cin>>x>>y;while(cin>>a>>b>>c>>d){s+=sqrt((a-c)*(a-c)+(b-d)*(b-d));......
  • Mariadb取24小时数据--九五小庞
    Mariadb是一种常用的关系型数据库管理系统。在进行实时数据处理时,我们常常需要查询最近24小时的数据来进行分析和处理。下面我们将介绍如何使用MySQL查询最近24小时的数据。SELECT*FROMtable_nameWHEREtimestamp_column>=DATE_SUB(NOW(),INTERVAL24HOUR);如果要查询......
  • Mit 6.824 学习记录
    MapReduce实验干嘛实现一个分布式的MapReduce,由两部分组成,master和worker。一个master,多个worker。在本机运行,worker和master用rpc通信。每个worker向master索要任务,从一个或多个文件读取任务的输入,执行任务,并将任务的输出写入一个或更多文件。如果超时(10s)将工作......