首页 > 其他分享 >赛后总结

赛后总结

时间:2023-11-29 18:22:53浏览次数:42  
标签:总结 le cout int cin tie 赛后 本题

赛后总结

CF Round 908(div2)

A. Secret Sport

本题读懂题以后,是秒杀的,但鉴于本人语文实在不好,还是花费了20多分钟。

本题询问全局获胜的人是A还是B,但实际上最后一局的获胜者就是赢家,所以只需输出最后一个胜利的人即可。

下面就是本题简单的代码:

#include<bits/stdc++.h>    
using namespace std;
int n,t;
string s;
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--)
	{
		cin>>n;
		cin>>s;
		cout<<s[n-1]<<endl;
	}	
    return 0;
}

B. Two Out of Three

本题构造题,要满足下列条件(只满足其中$2$个):

  • 存在$1\le i,j \le n$,使得$a_i=a_j,b_i=1,b_j=2$
  • 存在$1\le i,j \le n$,使得$a_i=a_j,b_i=1,b_j=3$
  • 存在$1\le i,j \le n$,使得$a_i=a_j,b_i=2,b_j=3$

由此可知原数组至少有$2$组及以上的相等的值,否则输出$-1$。

那么也就可以构造其中两组等值满足只含有$1,2$和$1,3$,所以也就有了代码:

#include<bits/stdc++.h>
using namespace std;
int t;
int n;
int a[105];
int cnt[105];
int is[105];
int tot;
bool _3,_2;//判断是否已经有了1,2或1,3
int b[105];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--)
	{
		cin>>n;
		_3=0,_2=0;
		tot=0;
		memset(cnt,0,sizeof cnt);
		for(int i=1;i<=n;i++) 
		{
			cin>>a[i],cnt[a[i]]++;
			b[i]=1;
			if(cnt[a[i]]==2)
			{
				tot++;
				if(!_3) is[a[i]]=3,_3=1;
				else if(!_2) is[a[i]]=2,_2=1;
				else is[a[i]]=1;
			}
			if(cnt[a[i]]>=2) b[i]=is[a[i]];
		}
		if(tot<2) cout<<-1<<endl;
		else
		{
			for(int i=1;i<=n;i++)
			cout<<b[i]<<" ";
			cout<<endl;
		}
	}
    return 0;
}

C. Anonymous Informant

本题开始VP时就做不来了,但赛后讲完豁然开朗,总会想当初为何没想到,所以总之还是要多做题。

本题可以有不动点的移动推出每一次移动后,最后一个值就是上一次的不动点,我们也就可以得到上一次移动前的不动点,如果该点的值大于$n$,那么定是不能在移动了,此时如果移动次数小于$k$,那就不可行,否则$min(k,n)$次后仍能移动则可行(注:如果能移动$n$次那一定有循环节,后面则无需继续)。

于是就有了代码 真是后悔没想到

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int t;
int n,k;
int a[N];
int inx[N];
int p;

bool solve(int v)
{
	if(v>=min(n,k)) return true;
	int q=a[p];
	if(q>n) return false;
	p=(p-q+n)%n;
	if(!p) p=n;
	return solve(v+1);
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--)
	{
		cin>>n>>k;
		for(int i=1;i<=n;i++) inx[i]=i,cin>>a[i];
		p=n;
		if(solve(0))cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}
    return 0;
}

D. Neutral Tonality

做到现在发现之前甚至连算法都还没考,终于来了一道贪心,但我VP时看都没看到这道题。

这道题的贪心,就是给$b$数组从大到小排序,这样$b$数组本身是不会贡献任何最长上升子序列长度的。

接着就是考虑如何插入的问题,这也好想,只需要在$a$数组中找到第一个小于$b$数组当前值时插入,这样也不会贡献最长上升子序列长度。而寻找这个第一个小于它的值则可以用双指针即可。

所以由此就得到了AC代码:

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int a[N],b[N];
int t;
int n,m;

bool cmp(int x,int y)
{
	return x>y;
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--)
	{
		cin>>n>>m;
		for(int i=1;i<=n;i++) cin>>a[i];
		for(int i=1;i<=m;i++) cin>>b[i];
		sort(b+1,b+m+1,cmp);
		int q=1;
		for(int i=1;i<=n;i++)
		{
			while(a[i]<b[q]&&q<=m) cout<<b[q++]<<" ";
			cout<<a[i]<<" ";
		}
		while(q<=m) cout<<b[q++]<<" ";
		cout<<endl;
	}
    return 0;
}

E. Freedom of Choice

本题实在是难以读懂题意,于是我打开了洛谷寻找本题翻译
读完题意发现还是有点难度的,看了看题解的解释,又是豁然开朗(就是自己做不来),在此自己复述一遍。

本题可以轻易求出最后的数组长度的范围$L \le |S| \le R$,其中$L=\sum_1ml_i,R=\sum_1mr_i$我们可以发现如果$\R-L+1>\sum_1mlc_i$,那么就可以直接输出$0$,因为$a$的种类只有$\sum_1mlc_i$种。

那么就接着考虑剩余的情况,也就可以枚举$|S|$。基于贪心的思想,对于每一个可重集,我们可以从中选取$[l_i,r_i]$个值。

如果其中不等于$|S|$的值个数$|s_i|$大于$r_i$,那么就选取这其中$r_i$个数,反之,则必须要补充上$|l_i-s_i|$个$|S|$值,那么计数也要加上$|l_i-s_i|$。
所以代码如下:

#include<bits/stdc++.h>
#define mk make_pair
using namespace std;
typedef long long ll;
const int N=1e5+5;
int t;
ll m;
ll n,l[N],r[N];
ll sz,sl,sr,a[N],c[N],lc[N];

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--)
	{
		cin>>m;
		map<ll,vector<int> > is;
		map<pair<int,ll>,ll> val;
		sz=sl=sr=0;
		for(int i=1;i<=m;i++)
		{
			cin>>n>>l[i]>>r[i];
			sl+=l[i],sr+=r[i];
			sz+=n;
			lc[i]=0;
			for(int j=1;j<=n;j++)
				cin>>a[j],is[a[j]].push_back(i);
			for(int j=1;j<=n;j++)
				cin>>c[j],lc[i]+=c[j];
			for(int j=1;j<=n;j++)
				val[{i,a[j]}]=c[j];
		}
		if(sr-sl+1>sz)
		{
			cout<<0<<endl;
			continue;
		}
		ll ans=LONG_LONG_MAX;
		for(ll cnt=sl;cnt<=sr;cnt++)
		{
			ll tot=sr,rs=0;
			vector<int> inx=is[cnt];
			for(int i:inx)
			{
				tot-=r[i];
				ll cr=lc[i]-val[{i,cnt}];
				if(cr<l[i]) rs+=l[i]-cr,r=l[i];
				tot+=min(cr,(ll)r[i]);
			}
			ans=min(ans,rs+max(0ll,cnt-tot));
		}		
		cout<<ans<<endl;
	}
    return 0;
}

终于完成了!

标签:总结,le,cout,int,cin,tie,赛后,本题
From: https://www.cnblogs.com/ljh-hh/p/17865545.html

相关文章

  • 每日总结20231129
    代码时间(包括上课)5h代码量(行):100行博客数量(篇):1篇相关事项:1、今天是周三,今天只有一节课,就是软件构造,这节课是实验课,这周是第十三周了,马上也迎来了这学期的末尾,大作业的题目也发布了。2、今天下午洗了洗澡,刷了刷抖音,然后把衣服洗了,又发了篇博客。3、今天晚上打算把大数据的最后......
  • 2023-2024-120231329《计算机基础与程序设计》第10周学习总结
    作业信息这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#WEEK10这个作业的目标计算机科学概论第12,13,14章云班课测试《C语言程序设计》第9章并完成云班课测试作......
  • 客户端开发工作总结
    1.动机在长达8年的前端工作经验后,发现还是不知道想做啥。自己对技术的掌握还是停留在对数据的展示和存储上。因此先对之前的工作中用到的知识做一个抽象的总结,再思考自己应该去掌握什么技术,又想学什么技术。2.认知客户端开发主要工作即开发UI(userinterface),与用户交互的界面......
  • influxdb 连续查询使用总结
    转载请注明出处:1.定义:InfluxDB连续查询(ContinuousQuery)是一种自动化查询类型,该查询会根据定义的时间间隔定期运行,并将结果存储在新的目标测量中。这样的查询通常用于处理大量时间序列数据。2.基本语法使用语法格式:CREATECONTINUOUSQUERY<cq_name>ON<db_name>BEGIN......
  • Linux课堂知识总结5
    在这节课的学习中,我知道了Linux系统进程的概念程序(program)是一个普通文件,是为了完成特定任务而准备好的指令序列与数据的集合,这些指令和数据以“可执行映像”的格式保存在磁盘中。进程(process)是一个已经开始执行但还没终止的程序实例。Linux系统下使用ps命令可以查看到当前正......
  • Linux课堂知识总结6
    在这节课的学习中,我了解了linux标准输入输出:    程序:指令+数据     程序:IO可用于输入的设备:文件,键盘设备,文件系统上的常规文件,网卡等;可用于输出的设备:文件,显示器,文件系统上的常规文件,网卡等,程序的数据流有三种:    输入的数据流:<-- 标准输入(stdin),键盘......
  • 2023年11月28日总结
    更好的观看总结听说明天就要有省选模拟了,哇酷哇酷。今天还是复习计算几何,还是很有难度的!今天做了一孔之见,最小圆覆盖,还有圆的面积并。复习了一下[[K-DTree]],看了一下书。收获很多,那个自适应辛普森很有趣呢。就这样吧!哈哈。细节没有什么好说的呢,感觉。一孔之见就那个每条边来......
  • 每日总结
    今日收获写完了软件构造实验一和实验二,都挺简单的,反正,成就感挺大的吧~~~在写实验三,学习JFinal框架;复习一下大数据的相关知识;明天预计复习英语六级;希望昨天剩下的东西能弄完~~~......
  • Linux的总结
    作为一个学习Linux的人,我有一些深刻的心得和体会。首先,学习Linux让我对计算机操作系统有了更深入的理解。通过学习Linux,我了解到操作系统是计算机系统中的核心组件,负责管理计算机的硬件资源、提供用户界面、运行应用程序等。深入学习Linux让我对操作系统的原理和内部工作有......
  • 每日总结(37)
    代码时间(包括上课)5h代码量(行):100行博客数量(篇):1篇相关事项:1、今天是周五,今天上午进行了软件需求分析课上的有关于大数据竞赛的题目的考试,也很顺利的写完了。2、今天下午洗了洗衣服,刷会抖音,睡了一觉,好好休息了一下午。3、今天晚上打算继续完成人机交互的作业。......