牛客月赛57

Fly

A.最大面积

思路:
取宽的最小值*长的最小值即可。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a,b,c,d;

int main(){
	scanf("%d%d%d%d",&a,&b,&c,&d);
	ll ans=1ll*min(a,c)*min(b,d);
	printf("%lld\n",ans);
	return 0;
}

B.种树

题意:
一横排方块,每次选择一个有树的块开始走,只能选择一个方向并且沿着此方向走下去,问种满树至少需要多少天。

思路:
(1)当每个块都有树时,0天。
(2)当边界有树时,只需要从这个地方出发走完即可,只需1天。
(3)边界都没有树,那就是2天。

代码:

#include <bits/stdc++.h>
using namespace std;
int main(){
	int n;
	string s;
	cin>>n;
	cin>>s;
	if(s.find('0')==string::npos) printf("0");
	else if(s[0]=='1'||s[n-1]=='1') printf("1");
	else printf("2");
	return 0;
}

C.奇怪的电梯

题意:
给出出发的楼层a和要到达的楼层b,进入电梯后相邻k层的楼层都是不能按的,问最后a能否到达b。

思路:
首先ab一定可以到达。
其次,当n<=k时,只有a
b可以到达。
当n>k时,此时1一定能到达n,因此可以将1和n作为中转楼层。
那么a必须满足abs(a-1)>k或者abs(a-n)>k,
b必须满足abs(b-1)>k或者abs(b-n)>k。

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,k,a,b;
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%lld%lld%lld%lld",&n,&k,&a,&b);
		if(a==b){
			puts("YES");
		} 
	    else if(n<=k) puts("NO");
	    else if((((abs(a-1))>k)||((abs(a-n))>k))&&((abs(b-1))>k||(abs(b-n)>k))){
	    	puts("YES");
		}
		else puts("NO");
	}
	return 0;
}

D.最大gcd

题意:
给出一个数字序列a,求出这个序列中出现过的最大的gcd。

思路:
最容易想到的就是从小到大枚举因子,如果这个因子出现了>=2次,就更新ans。
初始先设置ans=1,因为1肯定是一个gcd。
再记录下每个数字a[i]出现的次数,
再在1~N范围内从小到大枚举因子i,并且枚举从i ~ N的i的倍数,累计出现的次数,
如果出现了>=2次,ans=max(ans,i);

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6+10;
int n,a[N],num[N];

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]),num[a[i]]++;
	int ans=1;
	for(int i=1;i<N;i++){//从小到大枚举因数 
		int sum=0;//累计此因子出现的次数 
		for(int j=i;j<N;j+=i){//从>=i并且后面为i的倍数中找 
			sum+=num[j];
		}
		//如果此因子出现了>=2次,ans=max(ans,i) 
		if(sum>=2) ans=max(ans,i);
	}
	printf("%d\n",ans);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值