【codeforces】cf880div2 vp小结

发布时间 2023-10-16 21:39:20作者: 木易meow

碎碎念

多测要清空!清空从0开始循环!!!!!!!爆哭
不知道因为初始化和清空罚了多少次了呜呜呜呜呜
这次真的真的记得清空了,但是因为一直习惯下标从1开始所以导致for循环清空的时候a[0]没有清空
A和B简简单单的两个签,但是C的难度就突然升高,补题的时候发现1700的时候真的...犹豫了一下要不要补(但还是补了,开都开了那就补吧)

A.Destroyer

  • 题意:

约翰是独立操作系统联邦空间海军的一艘驱逐舰上的首席程序员。他的任务之一是检查机器人的电子大脑是否在战斗中受损。 一个标准的测试是命令机器人排成一行或多行,每行机器人应该一个接一个地站立。然后,每个机器人报告它所在行前面的机器人数量。
机器人排列的一个例子(行的前面在左边)。机器人报告的数字如上所示。第i个机器人报告了数字
li。不幸的是,约翰不知道每个机器人所在的行,并且无法检查报告的数字。请确定是否可能以这样的方式排列机器人,使得所有报告的数字都是正确的。

  • 思路:
    统计再输出,很简单的一个题目。排列策略是尽可能的先排满一行再去排下一行,所以排头一定不比排在二号位的少。
  • code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[105];
void sol(){
	int n,k;cin>>n;
	for(int i=1;i<=n;i++){
		cin>>k;
		a[k]++;
	}
	int f=1;
	for(int i=1;i<=100;i++){
		if(a[i]>a[i-1]){
			f=0;
			break;
		}
	}
	if(f==0)cout<<"NO"<<endl;
	else cout<<"YES"<<endl;
	for(int i=0;i<=100;i++){
		a[i]=0;
	}
	return ;
}
signed main(){
	int t;cin>>t;
	while(t--){
		sol();
	}
	return 0;
}

B.Astrophysicists

  • 题意:

有 n 个人,k 个金币,每个金币价值 g 个银币。良心公司要把这 k 个金币作为工资分给这n 个人,但是没有办法平均分配,良心老板想出了分配规则:由你设定每个人分配的银币数xi。
老板会把银币数转化为金币发放,所以想出了以下规则:四舍五入
问,能节约的最多金币数

  • 思路:
    节约的原则:尽可能给尽可能多的人发舍的最大值。
  • code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[105];
void sol(){
	int n,k,g;
	cin>>n>>k>>g;
	int tot=k*g,re=(g+1)/2-1;
//	cout<<re<<endl;
//	cout<<tot<<' '<<re<<endl;
	if(re*n>=tot){
		cout<<tot<<endl;
		return;
	}
	int res,ans;
	res=re*(n-1);
//	cout<<res<<endl;
	ans=res;
	res=tot-res;
//	cout<<res<<endl;
	int r=res%g;
//	cout<<r<<endl;
	if(r<=re)ans+=r;
	else ans+=r-g;
	cout<<ans<<endl;
	return ;
}
signed main(){
	int t;cin>>t;
	while(t--){
		sol();
	}
	return 0;
}

C.k-th equality

  • 题意:

对于等式A+B=C,已知A、B、C的位数a、b、c,问符合要求的第k小式子。如果没有则输出"-1"

  • 思路:
    枚举A,分别计算符合要求的有多少个。
  • code:
#include<bits/stdc++.h>
#define int long long
using namespace std;
void sol(){
	int a,b,c,k;cin>>a>>b>>c>>k;
	for(int i=pow(10,a-1);i<pow(10,a);i++){
		int l=max(pow(10,b-1),pow(10,c-1)-i);
		int r=min(pow(10,b)-1,pow(10,c)-i-1);
		if(l>r)continue;
		if(k<=(r-l+1)){
			cout<<i<<" + "<<l+k-1<<" = "<<i+l+k-1<<endl;
			return;
		}
		k-=(r-l+1);
	}
	cout<<"-1"<<endl;
	return;
} 
signed main(){
	int t;cin>>t;
	while(t--){
		sol();
	}
	return 0;
}