牛客小白月赛53(A~E)

出题人题解

A - Raining(水题)

思路:读清题意即可。

AC Code:

#include <bits/stdc++.h>

#define INF 0x3f3f3f3f
typedef long long ll;
const int mod=1e9+7;
const int N=105;
int a,b,c,d,x;

int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	std::cin>>a>>b>>c>>d>>x;
	std::cout<<std::max(0,x-a)<<' '<<std::max(0,x-b)<<' '<<std::max(0,x-c)<<' '<<std::max(0,x-d)<<'\n';
	return 0;
}

B - Kissing(数学化简)

思路:根据完全平方公式和平方差公式化简所求,发现前n项和为n*n,注意取模,开ll。

AC Code:

#include <bits/stdc++.h>

#define INF 0x3f3f3f3f
typedef long long ll;
const int mod=998244353;
const int N=105;
ll n;

int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	std::cin>>n;
	n%=mod;
	std::cout<<n*n%mod<<'\n';
	return 0;
}

 C - Missing(字符串,暴力)

 思路:暴力模拟,注意特殊情况判断,题意很清楚了。

AC Code:

#include <bits/stdc++.h>

#define INF 0x3f3f3f3f
typedef long long ll;
const int mod=998244353;
const int N=105;
std::string s;
std::string a[N];
int n;

struct node{
	std::string s;
	double sim;
} e[N],ans[N];

bool cmp1(node a,node b){
	if(a.sim>b.sim) return true;
	else return false;
}

bool cmp2(node a,node b){
	if(a.s<b.s) return true;
	else return false;
}

int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	std::cin>>s;
	int len=s.length();
	std::cin>>n;
	for(int i=0;i<n;i++){
		std::cin>>a[i];
		e[i].s=a[i];
		if(a[i].length()!=len) e[i].sim=0;
		else{
			double cnt=0;
			for(int j=0;j<len;j++){
				if(s[j]==a[i][j]) cnt++;
			}
			e[i].sim=cnt/len;
		}
	}
	std::sort(e,e+n,cmp1);
	if(e[0].sim==0){
		std::sort(e,e+n,cmp2);
		for(int i=0;i<n;i++){
			std::cout<<e[i].s<<'\n';
		}
		return 0;
	}
	int tot=0;
	for(int i=0;i<n;i++){
		ans[i].s=e[i].s;
		tot++;
		if(e[i+1].sim!=e[i].sim) break;
	}
	std::sort(ans,ans+tot,cmp2);
	for(int i=0;i<tot;i++){
		std::cout<<ans[i].s<<'\n';
	}
	return 0;
}

 os:前三题太慢了,我直接掉大分

D - Breezing(DP)

思路:首先有一个结论,最优方案的每个数,要么是1,要么是b[i]。对于这样的结论,我们采用DP,令f[i][j]表示第i个数结尾,状态为j时的最大值(j=0时,第i个数为1;j=1时,第i个数为b[i]),线性转化,时间复杂度O(n),能过。

AC Code:

#include <bits/stdc++.h>

#define INF 0x3f3f3f3f
typedef long long ll;
const int mod=998244353;
const int N=1e5+5;
int n;
int a[N];
int f[N][2];

int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	std::cin>>n;
	for(int i=1;i<=n;i++){
		std::cin>>a[i];
	}
	for(int i=2;i<=n;i++){
		f[i][0]=std::max(abs(1-1)+f[i-1][0],abs(1-a[i-1])+f[i-1][1]);
		f[i][1]=std::max(abs(a[i]-1)+f[i-1][0],abs(a[i]-a[i-1])+f[i-1][1]);
	}
	std::cout<<std::max(f[n][1],f[n][0])<<'\n';
	return 0;
}

os:一开始想到可能是DP,但是对DP太不熟练,不知道DP可以O(n)这样写。。。

E - Calling

思路:先贪心放较大的,很显然,对于边长为4,5,6的,只能一个框里放一个;对于边长为3的,一个框可以放4个,注意答案加s/cnt向上取整,cnt指边长为3的个数。对于边长为2的,可以和边长为4的放在一个框中,一个框还可以再放5个;可以和边长为3的放在一个框中,注意分该框中有几个边长为3的分类。对于边长为1的,哪里有空就可以放在哪。

AC Code:

#include <bits/stdc++.h>

typedef long long ll;
typedef std::pair<int,int>PII;
const int N=2e4+5;
int t,s;
double a,b,c,d,e,f;

int main(){
	std::ios::sync_with_stdio(false);
	std::cin.tie(0);
	std::cout.tie(0);
	std::cin>>t;
	while(t--){
		std::cin>>s;
		std::cin>>a>>b>>c>>d>>e>>f;
		int ans=d+e+f+ceil(c/4);
		int putB=d*5;
		if((int)c%4!=0){
			if((int)c%4==1) putB+=5;
			if((int)c%4==2) putB+=3;
			if((int)c%4==3) putB+=1;
		}
		if(b>putB){
			ans+=ceil((b-putB)/9);
		}
		int res=6*6*f+5*5*e+4*4*d+3*3*c+2*2*b;
		int putA=6*6*ans-res;
		if(a>putA) ans+=ceil((a-putA)/36);
		std::cout<<(ans<=s?"Yes":"No")<<'\n';
	}
	return 0;
}

os:标程真的超简洁

若有错误请指教,谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值