Codeforces Round #481 (Div. 3)完结

Posted 辉小歌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #481 (Div. 3)完结相关的知识,希望对你有一定的参考价值。

2022.3.1
题目地址:https://codeforces.com/contest/978

目录

A. Remove Duplicates【模拟】

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],st[N],n;
set<int>s; 
vector<int>ve;
int main(void)

	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i],s.insert(a[i]);
	cout<<s.size()<<endl;
	for(int i=n-1;i>=0;i--)
	
		if(st[a[i]]) continue;
		ve.push_back(a[i]);
		st[a[i]]++;
	
	for(int i=ve.size()-1;i>=0;i--) cout<<ve[i]<<" ";
	return 0;

B. File Name【贪心 / 双指针】


计算出一段一段的xxx…,对于每一段计算最少的删除个数,累加即可。

#include<bits/stdc++.h>
using namespace std;
int n;
string s;
int main(void)

	cin>>n>>s;
	if(s.find("xxx")==-1) puts("0");
	else
	
		int cnt=0;
		for(int i=0;i<s.size();i++)
		
			if(s[i]=='x')
			
				int j=i;
				while(j+1<s.size()&&s[j+1]=='x') j++;
				int len=j-i+1;
				if(len>=3) cnt+=len-2;
				i=j;
			
		
		cout<<cnt;
	
	return 0;

C. Letters【前缀和+二分】

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
LL a[N],b[N],s[N],n,m;
int main(void)

	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];
	for(int i=1;i<=m;i++) 
	
		cin>>b[i];
		int index=lower_bound(s+1,s+n+1,b[i])-s;
		cout<<index<<" "<<b[i]-s[index-1]<<endl;
	
	return 0;

D. Almost Arithmetic Progression【暴力枚举】


不难但是细节挺多的,枚举前两项,即可确定公差。
然后判断即可,注意原数据和等差数列的数据的差值最多为1。

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
typedef long long int LL; 
int dx[3]=0,-1,1;
int a[N],n,ans=1e9;
void solve(int x,int sum,int d)

	int b[N]=0;
	b[1]=x;
	for(int i=2;i<n;i++) b[i]=b[i-1]+d;//根据首相公差构造数组
	for(int i=2;i<n;i++) 
	
		int len=abs(b[i]-a[i]);
		if(len>1) return;//公差大于1
		sum+=len;
	 
	if(sum<=n) ans=min(ans,sum);//步数小于等于n

int main(void)

	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i];
	if(n==1) puts("0");return 0;
	for(int i=0;i<3;i++)
	
		for(int j=0;j<3;j++) 
		
			int tempx=a[0]+dx[i];
			int tempy=a[1]+dx[j];
			int d=tempy-tempx;//公差
			solve(tempy,abs(dx[i])+abs(dx[j]),d);//a[1] 步数  公差
		
	
	if(ans<=n) cout<<ans;
	else cout<<-1;
	return 0;

E. Bus Video System【思维 贪心】


同过多次读题你会发现,求其前缀和就是各个站所对应的人数。
我们存一下,minv和maxv则显然问题就转化成了使这个图形向上平移。最多可以平移多少步可以使minv>=0且maxv<=m。

分为4种情况:

  • minv>=0,maxv>=0
  • minv>=0,maxv<=0(直接pass)
  • minv<=0,maxv>=0
  • minv<=0,maxv<=0
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int a[N],n,m;
int main(void)

	cin>>n>>m;
	int minv=1e9,maxv=-1e9,sum=0;
	for(int i=0;i<n;i++) cin>>a[i];
	for(int i=0;i<n;i++)
	
		sum+=a[i];
		maxv=max(maxv,sum);
		minv=min(minv,sum);
	
	if(minv<-m||maxv>m) 
	
		puts("0");
		return 0;
	
	if(minv>=0&&maxv>=0) cout<<m-maxv+1;
	else if(minv<=0&&maxv>=0)
	
		maxv+=abs(minv);
		if(maxv>m) puts("0");
		else cout<<min(m-abs(minv)+1,m-maxv+1);
	
	else if(minv<=0&&maxv<=0)
	
		maxv+=abs(minv);
		if(maxv>m) puts("0");
		else cout<<min(m-abs(minv)+1,m-maxv+1);
	
	return 0;

F. Mentors【二分】

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int a[N],b[N],cnt[N],n,m;
int main(void)

	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i],b[i]=a[i];
	sort(b+1,b+n+1);
	while(m--)
	
		int s1,s2; cin>>s1>>s2;
		if(a[s1]>a[s2]) cnt[s1]--;//将冲突的数量减去
		if(a[s1]<a[s2]) cnt[s2]--;//将冲突的数量减去
	
	for(int i=1;i<=n;i++)
	
		int l=lower_bound(b+1,b+n+1,a[i])-b;//找到大于等于a[i]的下标
		if(b[l]>=a[i]) l--;//减去
		cnt[i]+=l;
		cout<<cnt[i]<<" ";
	
	return 0;

G. Petya’s Exams【贪心】


按先结束的排序,在按先开始的排序。
然后枚举天数,贪心的模拟即可。
需要注意的一点就是题目隐含的信息是,对于每门的考试考试日必须考试这也是符合常理的。

#include<bits/stdc++.h>
using namespace std;
const int N=110;
int a[N],n,m,cnt,ans[N];
struct nodeint st,ed,c,k,id;Node[N];
bool cmp(node a,node b)

    if(a.ed==b.ed) return a.st<b.st;
    return a.ed<b.ed;

int main(void)

	cin>>n>>m;
	for(int i=0;i<m;i++) 
	
	    cin>>Node[i].st>>Node[i].ed>>Node[i].c,Node[i].id=i+1;
	
	sort(Node,Node+m,cmp);
	for(int i=1;i<=n;i++)
	
		for(int j=0;j<m;j++)
		
		    if((Node[j].c==Node[j].k)&&(i==Node[j].ed)) //准备的天数够了,且是考试日
		    
		        ans[i]=m+1,cnt++;
		        break;
		    
		    if(Node[j].k==Node[j].c) continue;//准备的天数够了但不是考试日。
			if(Node[j].st<=i&&i<Node[j].ed)//在区间内
			
				ans[i]=Node[j].id;
				Node[j].k++;
				break;
			
		
	
	if(cnt==m)//考完了m门
	
		for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
	else puts("-1");
	return 0;

以上是关于Codeforces Round #481 (Div. 3)完结的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #481 (Div. 3)

Codeforces Round #481 (Div. 3) C. Letters

Codeforces Round #481 (Div. 3) F. Mentors

Codeforces Round #481 (Div. 3) D. Almost Arithmetic Progression

Codeforces Round #481 (Div. 3) F. Mentors (模拟,排序)

Codeforces Round #481 (Div. 3) E. Bus Video System