这道题真的没什么好讲的
在比赛的时候看错题目了,后来发现不是质数,是奇数。就在原来的代码里改的,有点小复杂
class Solution {
public:
bool threeConsecutiveOdds(vector<int>& arr) {
bool flag1,flag2,flag3;
flag1=flag2=flag3=false;
for(int i = 0;i<arr.size();i++)
{
if(!(arr[i]&1))
{flag1=flag2=flag3=false;}
else if(!flag1)
{flag1 = 1;}
else if(!flag2)
{flag2 = 1;}
else if(!flag3)
{flag3 = 1;}
if(flag1&&flag2&&flag3)
return true;
}
return false;
}
};
这个题目我觉得有人证明出来:但是比赛的时候不会时间去证明一些东西
所以直接猜,我们直接选择最大的最小的开始加加减减
class Solution {
public:
int minOperations(int n) {
int arr[10005];
for(int i = 0;i<n;i++)
arr[i] = i * 2 + 1;
int t = (arr[n - 1] + arr[0])/2;
//cout<<t;
int sum = 0;
for(int i = 0;arr[i]<t;i++)
sum += (t -arr[i]);
return sum;
}
};
这道题目有点东西:
1.首先我们排好序列
2.我选择一个距离进行比对,假设是这个点,可以满住条件有
很多个,就是后一半里找。反之在前面找。
class Solution {
public:
int maxDistance(vector<int>& a, int m) {
sort(a.begin(),a.end());
int l = 0,r = 1e9;
while(l<r)
{
int mid = (l + r + 1) >> 1;
int cnt =1,last = a[0];
int n = a.size();
for(int i = 1;i<n;i++)
{
if(a[i]-last>=mid){last =a[i];cnt++;}
}
if(cnt>=m)l = mid;
else
r= mid - 1;
}
return r;
}
};
这道题目:
数据那么大,DP肯定过不了。
但是你可以想一下:我们要想步数很小那么肯定就是走2,3步骤尽可能多
在一个数字>=600000数字下,只要29次。
我们考虑DFS,BFS
class Solution {
unordered_map<int,int>d;
queue<int>q;
public:
int minDays(int n) {
q.push(n);
d[n]=0;
if(n==1)return 1;
while(!q.empty())
{
auto tmp = q.front();
if(tmp==1)return d[tmp] + 1;
q.pop();
extend(d[tmp],tmp-1);
if(tmp%2==0)extend(d[tmp],tmp/2);
if(tmp%3==0)extend(d[tmp],tmp/3);
}
return -1;
}
void extend(int dist,int x)//前者是距离,后者是还剩多少苹果
{
if(d.count(x))return;
d[x] = dist + 1;
q.push(x);
}
};