牛客编程巅峰赛S1第3场 - 青铜&白银

大家好,我是小黄呀。
@Time:2020/7/16 21:00-22:00
@Host:牛客网 

牛客网题目传送门

位数求和

题目大意

求所有长度为n的数中,各个 上的数字之和为m 的这些数的
题目虽然简短,还是得认真读两遍。

思路分析(暴力)

  1. 首先要表示长度为n的所有数,这里用一个[ pow(10,n-1),pow(10,n) )就可以表示范围了。
  2. 然后就是要求一个数的 位数之和,这里我写了一个sum1函数来求,想必大家都会(0.0)
  3. 然后暴力解法,直接遍历范围内的所有数,符合的话就加上,最后输出。

具体代码

class Solution {
public:
     //求位数之和
    long long sum1(long long A)
	{
    	long long DA=0;
    	while(A!=0)
       {
           int temp=A%10;
           DA+=temp;
           A=A/10;
       }
       return DA;

	}
	//暴力求解
   long long sum(int n,int m)
	{
    	long long len1=pow(10,n-1);
    	//cout<<len1<<endl;
    	long long len2=pow(10,n);
    	//cout<<len2<<endl;
    	long long cnt=0;
   		while(len1<len2)
    	{
        	long long len3=sum1(len1);
        	if((int)len3==m)
            	cnt+=len1;
        	//cout<<cnt;
        	len1++;
    	}
    	return cnt;
	}
};

牛牛晾衣服(POJ3104)

这道题大体与POJ3104类似,传送门

题目大意

n件带水的衣服,在数组vector<int>& a给出了每件衣服带的水份,定义了两种干燥衣服的方式。

  1. 自然烘干:每分钟衣服自然烘干1滴水
  2. 烘干机:每分钟可以烘干k滴水,但烘干机每次只能放一件衣服,并且烘干机工作的时候,其他衣服仍然可以进行自然烘干。

最终要求最少需要多少时间(分钟为单位)把衣服全部烘干。

思路分析

  1. 暴力解法易超时,利用二分法进行判断。
  2. k=1时,特判,即每分钟最多烘干1滴水,找出最大值、
  3. k>1时,首先,对vector进行排序,得到最大元素,找出水份最多的衣服;然后利用二分法的思想,构造了一个check函数来与中值进行比较,不断缩小范围,直至得到结果。
  4. check函数中,x用于查找最短时间,假设在x的时间内所有衣服一直在自然风干,则如果出现a[i]>x,则说明有多余的水份需要烘干机来烘干。
  5. 而对于每一个a[i],一定存在一个总时间m,使得a[i]=(m-n)+n*k,其中n即为需要烘干机使用的次数,n=(a[i]-m)/(k-1),这里由于n不满一次要当做一次,因此用celi函数进行向上取整。将每一个a[i]所需时间n相加,即为总的烘干机时间sum
  6. check函数的判定条件方式为:若sum<=mid,说明mid时间满足烘干所有衣服,需要向下缩小范围;若sum>mid,说明时间不够,需要向上缩小范围。

具体代码


typedef long long ll;

bool check(ll x,int n,vector<int>& a,int k)
{
	ll sum=0;
	for(int i=0;i<n;i++)
	{
		if(a[i]>x)
		{
			sum +=(ceil((a[i]-x)*1.0/(k-1)));
		}
	}
	if(sum>x)
		return 0;
	else
		return 1;
}
 int solve(int n, vector<int>& a, int k) {
       
	   sort(a.begin(),a.end());
	   ll l = 1;
	   ll r = a[n-1];
	   ll ans=0;
	   if(k==1)
	   		return (int)r;
	   	else
	   	{
	   		while(l<=r)
	   		{
	   			ll mid=(l+r)/2;
	   			if(check(mid,n,a,k)==1)
	   			{
				
	   				ans=mid;
	   				r=mid-1;
	   			}
	   			else
	   				l=mid+1;
	   			
			}
			return ans;	
		}
		
		  
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_AoSnow_

创作不易,打赏打赏些8

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值