碎碎念
多测要清空!清空从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;
}