Codeforces Round #744 (Div. 3)A-D E的题解

Posted 辉小歌

tags:

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

A. Elections【800 / 模拟】


https://codeforces.com/contest/1593/problem/A

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*2+10;
int n,m,t;
LL a[N];
int main(void)
{
	cin>>t;
	while(t--)
	{
		cin>>a[0]>>a[1]>>a[2];
		for(int i=0;i<3;i++)
		{
			LL ans=0;
			for(int j=0;j<3;j++) if(i!=j) ans=max(ans,a[j]);
			if(ans<a[i]) cout<<0<<" ";
			else cout<<ans-a[i]+1<<" ";
		}
		cout<<endl;
	}
	return 0;
}

B. Make it Divisible by 25【900 / 思维】


https://codeforces.com/contest/1593/problem/B
打表找规律,你会发现只要是'00' ,'25', '75, '50'这四种情况为后缀的必为25的倍数。
故需要枚举这4种情况,贪心的删除求解,总的求一个min。

#include<bits/stdc++.h>
using namespace std;
int t;
string s; 
int solve(char a,char b)
{
    int len=0;
	int k=s.size()-1;
	for(int i=s.size()-1;i>=0;i--) 
	{
		if(len&&s[i]==b) return (len-i-1)+(k-len);
		if(s[i]==a) len=i;
	}
	return 1e9;
}
int main(void)
{
	cin>>t;
	while(t--)
	{
		cin>>s;
		int ans=1e9;
	    ans=min(ans,solve('5','2')); 
	    ans=min(ans,solve('5','7')); 
    	ans=min(ans,solve('0','5'));
	    ans=min(ans,solve('0','0'));
		cout<<ans<<endl;
	}
	return 0;
}

C. Save More Mice【1000 / 贪心】


https://codeforces.com/contest/1593/problem/C
排序,从后到前的判断,可不可以,然后累加距离和。

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e5*5+10;
LL t,n,k;
LL a[N];
int main(void)
{
	cin>>t;
	while(t--)
	{
		cin>>n>>k;
		for(int i=1;i<=k;i++) cin>>a[i];
		sort(a+1,a+k+1);
		LL cnt=0,ans=0;
		for(int i=k;i>=1;i--)
		{
		    if(cnt>=a[i]) break;
			cnt+=n-a[i];
			ans++;
		}
		cout<<ans<<endl;
	}
	return 0;
}

D1. All are Same【1100 / 数学 最大公约数】


https://codeforces.com/contest/1593/problem/D1
求其除了最小数外其它数的公共最大公约数

#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
const int N=1e3*2+10;
LL t,n,a[N];
LL gcd(LL a,LL b) {return b?gcd(b,a%b):a;}
int main(void)
{
	cin>>t;
	while(t--)
	{
		cin>>n;
		map<LL,LL>mp;
		for(int i=1;i<=n;i++) cin>>a[i],a[i]+=1e6,mp[a[i]]++;//统一变成正数,其实不用也可以
		sort(a+1,a+1+n);
		if(mp.size()==1) cout<<"-1"<<endl;//全部相等的情况
		else 
		{
			vector<LL>ans;
			for(int i=1;i<=n;i++) if(a[i]-a[1]) ans.push_back(a[i]-a[1]);
			LL w=ans[0];
			for(int i=0;i<ans.size();i++) if(i) w=min(w,gcd(ans[i],ans[i-1]));
			cout<<w<<endl;
		}
	}
	return 0;
}

E. Gardener and Tree【1600 / 拓扑】


https://codeforces.com/contest/1593/problem/E
拓扑搞一下

#include<bits/stdc++.h>
using namespace std;
const int N=1e5*5;
int t,n,k;
int d[N]={0};
vector<int>ve[N];
int main(void)
{
	cin>>t;
	while(t--)
	{
		cin>>n>>k;
        for(int i=1;i<=n;i++) ve[i].clear();
		memset(d,0,sizeof 4*(n+1));
		for(int i=1;i<=n-1;i++)
		{
			int a,b; cin>>a>>b;
			ve[a].push_back(b);
			ve[b].push_back(a);
			d[a]++,d[b]++;
		}
		queue<int>q;
		for(int i=1;i<=n;i++) if(d[i]<=1) q.push(i);//<=1 的目的是 有孤点
		int cnt=n;
		while(q.size()&&k)
		{
			queue<int>temp;
			cnt-=q.size();
			while(q.size())
			{
				auto t=q.front(); q.pop();
				for(int i=0;i<ve[t].size();i++)
				{
					if(--d[ve[t][i]]==1) temp.push(ve[t][i]);
				}
			}
			q=temp;
			k--;
		}
		cout<<cnt<<endl;
	}
	return 0;
}

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

Codeforces Round #744 (Div. 3) A-F 题解

Codeforces Round #744 (Div. 3) A-F 题解

Codeforces Round #744 (Div. 3)ABCDE1E2FG题解

Codeforces Round #744 (Div. 3)ABCDE1E2FG题解

Codeforces Round #744 (Div. 3)ABCDE1E2FG题解

Codeforces Round #436 E. Fire(背包dp+输出路径)