力扣刷题
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;
}