Codeforces Round #479 (Div. 3)完结

Posted 辉小歌

tags:

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

2022.2.28 开始复盘div3
题目链接:https://codeforces.com/contest/977

目录

A. Wrong Subtraction【签到模拟题】

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

	int n,k; cin>>n>>k;
	while(k--)
	
		if(n%10) n--;
		else n/=10;
	
	cout<<n;
	return 0;

B. Two-gram【简单思维题】

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

	cin>>n>>a;
	for(int i=0;i+1<n;i++)
	
		string temp;
		temp=temp+a[i]+a[i+1];
		mp[temp]++;
		if(mp[temp]>cnt) cnt=mp[temp],s=temp;
	
	cout<<s;
	return 0;

C. Less or Equal【二分】

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*2+10;
int n,k,a[N];
int check(int x)

	int cnt=0;
	for(int i=0;i<n;i++) if(a[i]<=x) cnt++;
	return cnt;

int main(void)

	cin>>n>>k;
	for(int i=0;i<n;i++) cin>>a[i];
	int l=1,r=1e9;
	while(l<r)
	
		int mid=l+r>>1;
		if(check(mid)>=k) r=mid;
		else l=mid+1;
	
	if(check(l)==k) cout<<l;
	else cout<<-1;
	return 0; 

D. Divide by three, multiply by two【爆搜】


爆搜,注意开long long

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
typedef long long int LL;
LL a[N],n;
unordered_map<LL,LL>mp;
vector<LL>ve,ans;
void dfs(LL x,int index)

	if(index==n-1)
	
		ans=ve;
		return;
	
	if(mp[x*2])
	
		mp[x*2]--,ve.push_back(x*2);
		dfs(x*2,index+1);
		mp[x*2]++,ve.pop_back();
	
	
	if(x%3==0&&mp[x/3])
	
		mp[x/3]--,ve.push_back(x/3);
		dfs(x/3,index+1);
		mp[x/3]++,ve.pop_back();
	

int main(void)

	cin>>n;
	for(int i=0;i<n;i++) cin>>a[i],mp[a[i]]++;
	for(int i=0;i<n;i++)
	
		mp[a[i]]--;
		ve.clear(),ve.push_back(a[i]);
		dfs(a[i],0);
		if(ans.size())
		
			for(int j=0;j<ans.size();j++) cout<<ans[j]<<" ";
			return 0;
		
		mp[a[i]]++;
	
	return 0;

E. Cyclic Components【找干净环】


题目找的环是干净的,即不可以是多个环连着的,或着环有多余的边。
所以不能用常规的并查集找环的方法。

通过观察你会发现,这种干净的环,环上的点度数都是2
故我们可以先处理各个点的度数。
然后再跟常规的并查集找环一样,不过需要注意的是度数不为2的点都不是环上的点,故直接跳过。

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

	if(x!=p[x]) p[x]=find(p[x]);
	return p[x];

int main(void)

	cin>>n>>m;
	for(int i=1;i<=n;i++) p[i]=i;
	for(int i=0;i<m;i++)
	
		cin>>a[i]>>b[i];
		d[a[i]]++,d[b[i]]++;//记录度数
	
	for(int i=0;i<m;i++) 
	
		if(d[a[i]]!=2||d[b[i]]!=2) continue;//度数不为2直接跳过
		if(find(a[i])==find(b[i])) cnt++;//是环
		else p[find(a[i])]=find(b[i]);
	
	cout<<cnt;
	return 0;

F. Consecutive Subsequence【DP 特殊的最长上升子序列】


题目的意思就是让我们找一个最长的上升子序列,这里的上升是有条件的。
即: 2,3,4,5…
2,5,7 这是递增的但是不满足题意

#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
typedef long long int LL;
LL a[N],n,max_len,ed;
map<LL,int>mp;
int main(void)

	cin>>n;
	for(int i=1;i<=n;i++) 
	
		scanf("%d",&a[i]);
		mp[a[i]]=mp[a[i]-1]+1;//即当前结尾的最大的长度
		int len=mp[a[i]];
		if(len>max_len)
		
			max_len=len;//记录最长的长度
			ed=a[i];//结束的值
		
	
	LL st=ed-max_len+1;//开头
	printf("%d\\n",max_len);
	for(int i=1;i<=n;i++)
	
		if(st==a[i]) printf("%d ",i),st++;
	
	return 0;

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

Codeforces Round #479 (Div. 3)题解

Codeforces Round #479 (Div. 3) 题解

Codeforces Round #479 (Div. 3)解题报告

[CF977X]Codeforces Round #479 (Div. 3)

Codeforces Round #479 (Div. 3) E. Cyclic Components (思维,DFS)

Codeforces Round #479 (Div. 3) D. Divide by three, multiply by two