2021年度训练联盟热身训练赛第五场

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值