2021年度训练联盟热身训练赛第五场
链接:https://ac.nowcoder.com/acm/contest/13926
A Binary Seating
#include<bits/stdc++.h>
using namespace std;
const int M=1e7+10,inf=1e9+7;
#define ll long long
int a[50];
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
sort(a+1,a+1+n);
//排序,方便计算以当前学生时间为最长时间的选房情况种数
ll a2=1ll<<n;
//每个学生相互独立选房间,选0选1概率相同都为1/2->每种选房情况概率为1/(2^n)
ll cnt=1,ct=0;
double sum=0;
a[0]=0;
for(int i=1;i<=n;i++){
sum+=cnt*a[i];//种数*1号房间最长使用时间
//为下一种情况计算种数
ct+=cnt;
cnt=ct+1;
//(i+1)学生时间最长的情况下,种数为之前计算的种数和ct加1
//举例 1 2 3 4 5
//i-1=1 i=2 i+1=3
//i-1:{1}--------1种
//i:{{1}+{2}},{2}----------2种
//i+1: {{1}+{3}},{{1,2}+{3}},{{2}+{3}},{3} --------1+2+1种
//-----|---1---|,|---------2--------|,|-1-|
}
double ans=sum/a2;
printf("%.10lf",ans);
return 0;
}
B Cutting Corners
给一个矩形的长和宽h、w,计算(h+w)比矩形斜边(√h^2+ w^2)长多少
#include<bits/stdc++.h>
using namespace std;
const int M=1e7+10,inf=1e9+7;
#define ll long long
double a[50][50];
int main() {
int x,y;
cin>>x>>y;
double z=sqrt(x*x+y*y);
double ans=x+y-z;
printf("%.10lf",ans);
return 0;
}
C Ducky Debugging
#include<bits/stdc++.h>
using namespace std;
const int M=1e7+10,inf=1e9+7;
#define ll long long
int a[50];
int main() {
string s;
while(1){
getline(cin,s);
if(s=="I quacked the code!") break;
int l=s.length();
if(s[l-1]=='?') printf("Quack!\n");
else if(s[l-1]=='.') printf("*Nod*\n");
}
return 0;
}
D Eightgon
E Figure Skating
按照题意,每种字符串出现两次,两次出现位置的差值越小,越受jury的喜爱,当所有字符串差值相同时,存疑输出suspicious。
用map来联系字符串和它的位置差。
#include<bits/stdc++.h>
using namespace std;
const int M=1e7+10,inf=1e9+7;
#define ll long long
int a[50];
map<string,ll>mp;
map<ll,string>pm;
int main() {
int n;
cin>>n;
for(int i=1;i<=n*2;i++){
string s;
cin>>s;
if(i<=n) {
pm[i]=s;
mp[s]=i;
}
else mp[s]=i-mp[s];
}
ll minn=inf;
for(int i=1;i<=n;i++) {
minn=min(minn,mp[pm[i]]);
}
int f=0,k=0;
for(int i=1;i<=n;i++){
if(minn==mp[pm[i]]){
if(!f) k=i;
f++;
}
}
if(f==n) printf("suspicious\n");
else cout<<pm[k]<<endl;
return 0;
}
F Group Project
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M=1e5+10;
int fa[M],d[M];
int find (int x) {
if(fa[x]==x) return x;
else return fa[x]=find(fa[x]);
}
int main() {
int n,m;
cin>>n>>m;
for(int i=1; i<=n; i++)
fa[i]=i;
for(int i=1; i<=m; i++) {
int a,b;
cin>>a>>b;
if(d[a]) {
int x=find(d[a]),y=find(b);
if(x!=y)
fa[y]=x;
} else d[a]=b;
if(d[b]) {
int x=find(d[b]),y=find(a);
if(x!=y)
fa[y]=x;
} else d[b]=a;
}
int x=0,y=0,z=find(1);
for(int i=1; i<=n; i++) {
if(fa[i]==z)
x++;
else
y++;
}
int ans=x/2+y/2;
if(x&1&&y&1&&x*y!=m)
ans++;
cout<<ans<<endl;
}
G Human Pyramid
H In-place Sorting
求有没有可能通过转换‘6’和‘9’,使得n个数按照输入位置的的序列顺序呈现非降序序列,可能的话要输出满足条件的序列(任意一个皆可)。
遍历这n个数,进行操作:
1.将第i个数里的9全转为6(最小化数)
2.将第i个数从最低位数(j=0;j<l;j++)开始逐一将6转为9,直到第i个数大于等于第i+1个数,退出循环 (找到满足条件的较小的数)
3.将第i个数从最高位数(j=l-1;j>=0;j–)开始逐一将9转为6,当第i个数小于第i+1个数(不满足条件了)时,再将6转回9,否则继续判断该数的下一位数j+1(最小化满足条件的数)
(使用字符串输入方便69转换,比大小利用stoll())
#include<bits/stdc++.h>
#include<string>
using namespace std;
const int M=1e6+10,inf=1e9+7;
#define ll long long
string s[M];
int main() {
int n;
cin>>n;
s[0]="0";
int flag=0;
for(int i=1; i<=n; i++) {
cin>>s[i];
int l=s[i].length();
int f=0;
for(int j=0; j<l; j++) {
if(s[i][j]=='9')
s[i][j]='6';
}
ll x1=std::stoll(s[i]);
ll x2=std::stoll(s[i-1]);
if(x1<x2)
for(int j=l-1; j>=0; j--) {
if(s[i][j]=='6') {
s[i][j]='9';
ll x1=std::stoll(s[i]);
ll x2=std::stoll(s[i-1]);
if(x1>=x2) {
f=1;
break;
}
}
}
else f=1;
if(!f) flag=1;
for(int j=0; j<l; j++) {
if(s[i][j]=='9') {
s[i][j]='6';
ll x1=std::stoll(s[i]);
ll x2=std::stoll(s[i-1]);
if(x1>=x2) continue;
s[i][j]='9';
}
}
}
if(flag) cout<<"impossible"<<endl;
else {
cout<<"possible"<<endl;
for(int i=1; i<=n; i++)
cout<<s[i]<<endl;
}
return 0;
}
I Jam-packed
一共x个罐子要装箱,一个箱子可装y个罐子,求一种装箱方案,使得装的最少的箱子里的罐子最多,输出这个最少箱子里的最多罐子数。
1.x%y!=0 且 x>y
b=x/y个箱子装满,最后一个箱子装a=x%y个罐子,从其他的每个箱子都匀k个罐子到最后一个箱子,使得其他箱子和最后那一个箱子的罐子数差值最小(y-k<=a+k*b)。
k=(y-a+b)/(b+1)
ans=y-k
2.x%y==0
ans=y
3.x<=y
ans=x
#include<bits/stdc++.h>
using namespace std;
const int M=1e7+10,inf=1e9+7;
#define ll long long
int a[50];
int main() {
ll x,y;
cin>>x>>y;
if(x<=y) {
cout<<x<<endl;
return 0;
}
ll a=(x-1)%y+1;
ll b=x/y;
ll ans=0;
ll cha=y-a;
ll k=(cha+b)/(b+1);
ans=y-k;
cout<<ans<<endl;
return 0;
}
J Kangaroo Commotion