Educational Codeforces Round 52 (Rated for Div. 2) A(暴力)B(规律)C(思维)

本文解析了CodeForces上的三道经典算法题,包括数字分解、图论中孤立顶点的数量以及堆平衡问题,提供了详细的解题思路与AC代码。

A. Splitting into digits(暴力)

题目链接:https://codeforces.com/contest/1104/problem/A

题目大意:一个数字n,可以被分解成多少个相同的数字?这些数子di[1,9]

思路:暴力枚举即可;

AC:

int main(){
	ll n;
	while(cin>>n){
		for(int i=9;i>=1;--i){
			if(n%i==0){
				cout<<n/i<<endl;
				for(int j=1;j<=n/i;++j){
					cout<<i<<" ";
				}
				cout<<endl;
				break;
			}
		}
	}
}

B. Vasya and Isolated Vertices(规律)

题目链接:https://codeforces.com/contest/1065/problem/B

题目大意:n个顶点,m条边,问这张简单图中最多的孤立点和最少的孤立点是多少个

思路:每个边可以连接两个点,因此只用判断最少的孤立点n和2*m的关系即可;最多的孤立点,前面的图构成完全图,就是(i-1)*i/2个边。然后减去对应的点即可。

AC:

int main(){
	ll n,m;
	while(cin>>n>>m){
		if(n>2*m){
			cout<<n-2*m<<" ";
		}
		else{
			cout<<"0 ";
		}
		ll i;
		for(i=0;i<=n&&m>i*(i-1)/2;++i);
		cout<<n-i<<endl;
	}
}

C. Make It Equal(思维)

题目链接:https://codeforces.com/contest/1065/problem/C

题目大意:给你n堆东西,已知这些东西的高度,一次能铲一层,每次铲走的方块不能多于k个,问最少铲多少次

思路:把高度映射到一个数组中,然后从高处遍历,每次铲掉最多的那个即可。

AC:

int arr[MAXN],sum[MAXN+1];

int main()
{
	ll n,k;
	while(cin>>n>>k){
		clean(arr,0);
		clean(sum,0);
		for(int i=1;i<=n;++i){
			cin>>arr[i];
		}
		sort(arr+1,arr+n+1);
		for(int i=MAXN,j=n;i>=0;--i){
			for(;arr[j]>=i&&j>=0;--j);
			sum[i]=n-j;
		}
		ll res=0,ans=0;
		for(int i=MAXN;i>arr[1];--i){
			if(res+sum[i]<=k)
				res+=sum[i];
			else{
				res=sum[i];
				ans++;
			}
		}
		if(res)
			ans++;
		cout<<ans<<endl;
//		for(int i=10;i>=1;--i)
//			cout<<sum[i]<<endl;
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值