第一题:
1.题目链接:6112. 装满杯子需要的最短总时长 - 力扣(LeetCode)
2.题目思路:每次装水都力求装两次,因此先从小到大排序,先装最小的和最大的,在装最小的过程中保证最大始终最大(中间可以装最小和第二小),最后补完即可
class Solution {
public:
int fillCups(vector<int>& amount) {
sort(amount.begin(),amount.end());
int t=0;
if(amount[0]+amount[1]<=amount[2]) return amount[2]; //如果最大大于前两者总和,即最大的次数就是答案
else {
while(amount[0]!=0){
if(amount[2]>amount[1]){
amount[2]--;
t++;
}
else {
amount[1]--;
t++;
} //保证最大的不小于第二大
amount[0]--;
}
}
for(int i=1;i<=amount[1];i++){
amount[2]--;
t++;
}
for(int i=1;i<=amount[2];i++){
t++;
}
return t;
}
};
第二题:
1.题目链接:2336. 无限集中的最小数字 - 力扣(LeetCode)
2.解题思路:通过初始化为1,通过1与0的来表示剔除与添加
class SmallestInfiniteSet {
public:
int a[1010];
SmallestInfiniteSet() {
for(int i=1;i<1010;i++)
{
a[i]=1;
}
}
//所有值初始化为1
int popSmallest() {
int i;
for(i=1;i<=1000;i++)
{
if(a[i]==1)
{
a[i]=0;
break;
}
}
//每次找到最近的1,把它剔除
return i;
}
void addBack(int num) {
if(a[num]==0) a[num]=1; //如果该数被剔除,则添加回来
return;
}
};