每日总结3.26

力扣刷题

1217.玩筹码(√)
(逻辑分析,把奇数位全移动到一个上面,偶数位全移到一个上面,不消耗。然后把其中较少的移到较多的上面)

1736.替换隐藏数字得到的最晚时间(√)
(贪心,我们可以从高位向低位枚举,在保证时间有效的情况下,使得每一位尽可能取最大值。)

1323. 6和9组成的最大数字(√)
(找到最高位上的6,转化为9)
{stoi():字符型转整形    to_string():整形转字符型}

11.  盛最多水的容器(正解:双指针)


暴力,超时:

int maxArea(int* height, int heightSize) {
    int a=0,num=0;
    for(int i=0;i<heightSize;i++)
    {
        for(int j=i+1;j<heightSize;j++)
        {
            int b=height[i]<height[j]?height[i]:height[j];
            num=b*(j-i);
            if(num>a)
            {
                a=num;
            }
        }
    }
    return a;
}

正解:双指针(指针指向首位两项,比较两项大小,将小项下标前移)


int maxArea(int* height, int heightSize) {
    int an=0;
    for(int i=0,j=heightSize-1;i<j&&i<heightSize&&j>0;)
    {
        int num=fmin(height[i],height[j])*(j-i);
        if(num>an)
        {
            an=num ;
        }
        if(height[i]>height[j])
        {
            j--;
        }
        else
        {
            i++;
        }
    }
    return an;
}


135.分发糖果

(两个条件,分两次遍历。
第一次,右孩子比左孩子大的情况: 
if(ratings[i]<ratings[j])  a[j]=a[i]+1;
第二次,左孩子比右孩子大的情况(从后先前遍历):
if(ratings[i]>ratings[j]){a[i]=fmax(a[i],a[j]+1);


int candy(int* ratings, int ratingsSize) {
    int a[100005]={1,};
    for(int i=0,j=i+1;i<ratingsSize&&j<ratingsSize;j++,i++)
    {
         if(ratings[i]<ratings[j])
            {            
                a[j]=a[i]+1;
            }
        }

        for(int i=ratingsSize-2,j=i+1;i>=0&&j>=0;i--,j--)
        {
            if(ratings[i]>ratings[j])
            {
                a[i]=fmax(a[i],a[j]+1);
            }
        }
        int num=0;
       for(int i=0;i<ratingsSize;i++)
       {
        num+=a[i];
       }
       return num;
    }

134.加油站

int canCompleteCircuit(int* gas, int gasSize, int* cost, int costSize) {
    int a=0,b=0,start=0;
    for(int i=0;i<gasSize;i++)
    {
        a+=gas[i]-cost[i];
        b+=gas[i]-cost[i];
        if(a<0)
        {
            start=i+1;
            a=0;
        }
    }
    if(b<0)
    {
        return -1;
    }
    else
    {
        return start;
    }
}


蓝桥刷题

1.
分巧克力(二分法)

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=100005;
struct Node{
  int x,y;
}p[N];
int n,k;
bool check(int m)
{
  int ans=0;
  for(int i=0;i<n;i++)
  {
    ans+=(p[i].x/m)*(p[i].y/m);
  }
  if(ans>=k)
  {
    return true;
  }
  else
  {
    return false;
  }
}
signed main()
{
  cin>>n>>k;
  for(int i=0;i<n;i++)
  {
    cin>>p[i].x>>p[i].y;
  }
  int l=1;int r=100005;
  int max=0;
//找到最长
  while(l<=r)
  {
    int mid=(l+r)/2;
    if(check(mid))
    {
        max=mid;
      l=mid+1;
    }
    else
    {
      r=mid-1;
    }
  }
  
  cout<<max;
  return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值