“蔚来杯“2022牛客暑期多校训练营5 题解

B-Watches

题意:买表,表的原价为ai,如果买了k个表,则每个表要花ai+k*i元,给出拥有的钱,和想买的表的数量。求k的最大值

思路:k从1开始,每次将ai+=i,排序

AC代码:

#include <stdio.h>
#include <stdlib.h>
typedef long long ll;
int cmp(const void* a,const void* b);
ll tax(ll i);
int main()
{
	ll N,M;
	while(scanf("%lld %lld",&N,&M)!=EOF){
	
		ll value[N];
		ll a[N];
		for(ll i=0;i<N;i++){
			scanf("%lld",&value[i]);
		}
		ll k=0;
		while(++k){
			ll sum=0;
			for(ll i=0;i<N;i++){
				a[i]=value[i]+k*(i+1);
			}
			qsort(a,N,sizeof(ll),cmp);
			for(ll i=0;i<k;i++){
				sum+=a[i];
			}
			if(sum>M) break;
		}
		printf("%lld\n",k-1);
    }
}
ll tax(ll i){
	return i*(i+1)/2*i;
}

int cmp(const void* a,const void* b){
	return *(int*)a-*(int*)b;
}

H-Cutting

题意:
求|x|+|y|+|x+y|<=n与x^2+y^2=n^2/4去重后的总面积

思路:画图

AC代码:

 

#include <stdio.h>
#include <math.h>
const double pi=acos(-1);
double ans(double r);
int main()
{
	int n;
	while(scanf("%d",&n)!=EOF){
		printf("%.9lf\n",ans((double)n/2));
	}
}
double ans(double r){
	return pi*r*r/2+r*r*2;
}

I-Board Game

题意:有n个士兵,要分成m组(每组至少一个士兵),一起进攻一个水晶,每次造成1点伤害。水晶有x点血量,每次攻击会击杀一组中的k个士兵。士兵们和水晶依次进攻。问能否消灭水晶,如果可以,输出士兵们可以造成的最大伤害(这个时候认为水晶是无限血的)。

水晶采取最优策略

思路:水晶的攻击策略是每次攻击攻击场上士兵数量最多的一组。我们可以将士兵数n拆解为n=t*k+r的形式,其中r=Σ(a[i]%k)的形式(a[i]代表某组士兵的数量,a[i]>0) 根据题意可以得到r的范围。然后枚举t,再进行计算就好了

AC代码:

目录

B-Watches

H-Cutting

I-Board Game

K-Headphones


K-Headphones

题意,有n对耳机,妹妹拿了k对,要拿的对数比她多,至少要拿多少只才能保证一定比她多。

思路:剩余n-k对每一对至少要拿一只,然后还要再拿k+1只凑成k+1对。

AC代码:

#include <stdio.h>
typedef long long ll;
int main()
{
    ll n,k;
    while(scanf("%lld %lld",&n,&k)!=EOF){
        if(2*k+1<=n){
          printf("%lld\n",(k+1)+(n-k));
       }
       else{
        printf("-1\n");
       }
    }
     
     
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值