首页 > 其他分享 >Educational Codeforces Round 167 (Rated for Div. 2) A-D

Educational Codeforces Round 167 (Rated for Div. 2) A-D

时间:2024-07-01 18:08:54浏览次数:16  
标签:Educational Rated 每个 int 电影 Codeforces 金属 1e6 我们

image

A. Catch the Coin

image
image
image

题意:在一个二维坐标系上有一个硬币每秒y轴坐标减一,而你每秒可以向旁边八个方向移动,问你有没有一个时刻你会和硬币重叠。

思路:注意到在y小于-2时,我们无论如何都追不到硬币,而其他时候我们可以采取向左下或者右下的策略来保持和硬币y轴下落同步移动的时候接近硬币的x轴位置。所以判断一下y是否小于等于-2即可。

注意每个题都是折叠代码段!

点击查看代码
void solve()
{
	cin >> n;
	for (int i = 1;i <= n;i++)
	{
		int x, y;
		cin >> x >> y;
		if (y <= -2) cout << "NO" << endl;
		else cout << "YES" << endl;
	}
}

B. Substring and Subsequence

image
image
image

题意:给你一个a串和b串,让你在a串中添加字母,使得b串必须是a串的子串。

思路:我们可以想到如果a,b两个字符串没有字母重叠的话,答案就是a+b的长度,那么如果存在重叠的话答案就是a+b-max(重叠)。考虑到以b串每个字母为起点去遍历a有多长连续字符答案是不一样的,所以我们贪心的枚举每个b子串中的字母为起点的情况,就可以找到重叠的max值。

点击查看代码
void solve()
{
	string a, b;
	cin >> a >> b;
	int n = a.size(), m = b.size();
	a = " " + a, b = " " + b;
	int ans = 0;
	for (int i = 1;i <= m;i++)
	{
		int cnt = i;
		for (int j = 1;j <= n;j++)
		{
			if (b[cnt] == a[j]) cnt++;
		}
		ans = max(ans, cnt - i);
	}
	cout << n + m - ans << endl;
}

C. Two Movies

image
image
image

题意:有两部电影,n个人打分。每个人打的分为1电影评分加一,0不变,-1减一。你可以看到每个人对两部电影的评分,而你要选择其中一个使用,就是说如果a对一电影打了1分,对二电影打了0分,你可以选择让1电影加一分或者2电影分不变。最后你的答案就是分最低电影的评分。

思路:我们贪心的去想,如果是有(-1,0),(1,0),(-1,1)的情况,我们肯定是能选择加分就加分,能不减分就不变。而需要特殊处理的就是(1,1),(-1,-1)两种情况,因为这两种情况必须选一个加分选一个减分。所以我们记录这两种情况出现的次数,然后贪心思考怎么去把分加给或者减给1,2两部电影会得到最优解。这里我是采用先算出1,2此时的平均值,然后先把分加给最小达到平均值,把最大的减分减到平均来消耗减分项。然后分情况有加分或减分有剩余或没剩余。

点击查看代码
void solve()
{
	int a1 = 0, b1 = 0;
	cin >> n;
	for (int i = 1;i <= n;i++) cin >> a[i];
	for (int i = 1;i <= n;i++) cin >> b[i];
	int cnt1 = 0, cnt2 = 0;
	for (int i = 1;i <= n;i++)
	{
		if (a[i] == b[i] && a[i] == 1)
		{
			cnt1++;
		}
		else if (a[i] == 0 || b[i] == 0)
		{
			if (a[i] == 1) a1 ++;
			else if (b[i] == 1) b1 ++;
		}
		else if (a[i] == 1 || b[i] == 1)
		{
			if (a[i] == 1) a1++;
			else if (b[i] == 1) b1++;
		}
		else if (a[i] == b[i] && a[i] == -1)
		{
			cnt2++;
		}
	}
	int k = (a1 + b1) / 2;
	if (min(a1, b1) + cnt1 <= max(a1, b1) - cnt2) cout << min(a1, b1) + cnt1 << endl;
	else {
		int c = a1;
		a1 = min(c, b1);
		b1 = max(c, b1);
		if (k - a1 <= cnt1) {
			cnt1 -= (k - a1);
			a1 = k;
			if (b1 - k <= cnt2) {
				cnt2 -= (b1 - k);
				b1 = k;
				cnt1 -= cnt2;
				if (cnt1 == 0) cout << k << endl;
				else if (cnt1 > 0) cout << k + cnt1 / 2 << endl;
				else {
					cnt1 = -cnt1;
					cout << k - ceil(cnt1 / 2.0) << endl;
				}
			}
			else {
				b1 -= cnt2;
				if (b1 - a1 >= cnt1) cout << a1 + cnt1 << endl;
				else cout << b1 + (cnt1 - (b1 - a1)) / 2 << endl;
			}
		}
		else {
			a1 += cnt1;
			if (b1 - k <= cnt2) {
				cnt2 -= (b1 - k);
				if (b1 - a1 >= cnt2) cout << b1 << endl;
				else cout << b1 - ceil((cnt2 - (b1 - a1)) / 2.0) << endl;
			}
			else {
				cout << b1 << endl;
			}
		}
	}
}

D. Smithing Skill

image
image
image

题意:你可以消耗金属获得经验,然后每次消耗完都会返还给你一些金属,而这个过程也会给你经验。就是如果存在(9,8)的话,就是你用掉9金属然后得到8金属,最后只消耗了1金属获得了两点经验。而你有m个金属堆,金属堆中不同的金属不能叠加,所以要算每个堆的答案最后加起来。最后问你能用这些金属最多获得多少经验。

思路:首先我们能想到肯定是用转化率最多的金属最优,也就是a-b越小越好。然后我们做一个d数组用来存在每个大小段你能使用的最优转化。比如有(4,3),(3,1)那么我们可以得到d[4]=1,d[3]=2,同理d[5]=1,d[6]=1....但d[1],d[2]因为不存在小于等于2金属数量才能做到的转化,所以我们初始它们为无穷大。

所以我们在这里得到一个递推关系d[i]=min(d[i-1],d[i])。

得到每个金属个数最优转化解后我们将其转化为经验,在这里我们做一个f数组,得到递推关系f[i]=max(f[i],f[i-d[i]]+2)

然后我们将以上两个递推O(n)的递推到1e6的数据就可以得到每个金属个数的最大经验。但注意Cj能跑到1e9,所以我们对于大于1e6的数据先用1e6的最优解砍到1e6以下然后再加上f[cj]即可。

点击查看代码
void solve()
{
	cin>>n>>m;
	vector<int> d(1e6+5,1e7);
	vector<int> f(N);
	for(int i=1;i<=n;i++) {
		cin>>a[i];
	}
	for(int i=1;i<=n;i++) cin>>b[i];
	for(int i=1;i<=n;i++){
		d[a[i]]=min(d[a[i]],a[i]-b[i]);
		
	}
	for(int i=1;i<=1e6;i++){
		d[i]=min(d[i],d[i-1]);
	}
	for(int i=1;i<=1e6;i++){
		if(d[i]==1e7) continue;
		f[i]=max(f[i],f[i-d[i]]+2);
	}
	int res=0;
	for(int i=1;i<=m;i++){
		int x;
		cin>>x;
		if(x>1e6)
		{
			int s=1e6;
			int k=(x-s)/d[s]+1;
			x-=k*d[s];
			res+=k*2;
		}
		res+=f[x];
	}
	cout<<res<<endl;
}

El Psy Congroo" - Okabe Rintaro!

标签:Educational,Rated,每个,int,电影,Codeforces,金属,1e6,我们
From: https://www.cnblogs.com/onlypasserby/p/18278580

相关文章

  • Codeforces Round 918 G. Bicycles (二维最短路)
    G.Bicycles题意:在一个无向图里你要从1点到达n点,每条路的路径长度是该路的权值乘于你当前的慢度因子。而在每个点上我们都有一个慢度因子可以进行更换,问你到达n点所需要的最短时间。思路:我们很容易想到每次遇到更小的慢度因子我们就要更换,但因为存在你先去绕远路拿更小的慢......
  • Codeforces Round 894 (Div. 3) A-E cd 894 div3
    A.GiftCarpet每道题都是伸缩代码框有ac代码请不要漏掉--------------------------题解-----------------------------按先行便然后列再变循环设置jud每满足一个条件就让jud++只有jud==相应值的时候才让其++点击查看代码#include<bits/stdc++.h>usingnamespacestd;ch......
  • Codeforces Round 954 (Div. 3)
    A.XAxis题意:给3个x轴上的点xi,我们要放置一个点到x轴上,到这3个点的距离最短。(1<=xi<=10)思路:直接暴力破解即可inta,b,c;inlineintcal(intx){ returnabs(x-a)+abs(x-b)+abs(x-c);}voidsolve(){ cin>>a>>b>>c; intans=(int)1e9; for......
  • 创新实训 (九)CodeForces 数据和微调数据处理
    Codeforces数据获取Codeforces的题目中存在一些数学公式,所以处理的时候需要比较小心的对其进行处理。首先是题面数据,在CF当中标识一道题目的方式是problemSet与problemId。其中problemSet是一个数字,而problemId是一个字母。另外需要注意的是CF题面中存在许多数学......
  • 板刷codeforces构造题
    前言听说多写构造题可以提升思维能力...C.TurtleandanIncompleteSequence题目大意给定一个数组a,只有正整数和-1,-1可以改为正整数,问数组能否满足$\lfloora[i]/2\rfloor=a[i+1]或\lfloora[i+1]/2\rfloor=a[i]$,能则输出方案解题思路可以发现,相邻2个数在完全......
  • [AAAI2024]Out-of-Distribution Detection in Long-Tailed Recognition with Calibrat
    这篇文章设置的问题是:考虑长尾分布的训练集下,对测试集上的OOD样本进行检测。作者在训练集中引入了openset样本学习异常表征,以OCL(OutlierClassLearn)为baseline,训练时引入prototype方法,推理时对logits进行调整校准。问题背景DNNs会把OOD(out-of-distribution)样本误分类为ID(in-di......
  • Vitis Accelerated Libraries 学习笔记--OpenCV 安装指南
    目录1.简介2.安装过程2.1安装准备2.2常见错误2.2.1核心共享库报错3.通过实例测试 4.总结1.简介使用VitisVisionLibraryVitis视觉库,为什么要安装opencv库?在使用VitisVisionLibrary时,安装OpenCV库是因为许多视觉库的功能都提供了示例设计测试平台,使用......
  • Vitis HLS 学习笔记--Vitis Accelerated Libraries介绍
    目录1.简介2.库的组织结构 2.1结构级别L1/L2/L32.2文件内容3.分类介绍3.1 blas3.2codec3.3 data_analytics3.4 data_compression3.5 data_mover3.6 database3.7 dsp3.8graph3.9 hpc3.10 motor_control3.11 quantitative_finance3.12 securi......
  • Codeforces Round 952 (Div. 4)
    知识点模块1.一个正方体x,y,z里面可以放多少个边长为a,b,c的长方体ans=(x-a+1)*(y-b+1)*(z-c+1)题解模块A.CreatingWords交换两个字母的首字母即可swap实现即可点击查看代码#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongtypedefpair<int,int>......
  • Codeforces Round 953 (Div. 2) A - F
    A编号为\(n\)的一定选,第二叠书在\(1\simn-1\)选最大的。voidsolve(){ cin>>n; for(inti=1;i<=n;++i){ cin>>a[i]; } intans=a[n]; intx=0; for(inti=1;i<n;++i){ x=max(x,a[i]); } cout<<ans+x<&......