AcWing第70场周赛
分析:由于x<998,数据量较小,可以直接枚举,只需找到x的两个质因子即可。
代码实现:
#include <iostream>
using namespace std;
int main()
{
int x;
cin >> x;
for (int i = 2; ; i ++ )
if (x % i == 0)
{
cout << i << ' ' << x / i << endl;
break;
}
return 0;
}
分析:分析可知先进行操作1还是先进行操作2对数据最后的结果能否变成0没有影响,所以为了简化问题,我们可以考虑所有操作情况中,先对数据进行操作2的情况。由于对相邻两个数据进行两次操作2的结果等同于对相邻两个数分别进行两次操作1的结果,所以,我们假定每对相邻的两个元素之间只能进行一次操作2。这样我们的问题就可以转化为:能否通过多次的操作2,使原数列所有的数据都为非负偶数。因为当所有的数都为非负偶数后只需进行多次操作1一定能得到目标数列。
我们先从前往后找出数列中第一个奇数进行操作2,我们只能选择将该数与该数后面的那位数同时减去1,因为如果和该数前的数进行操作2,会使该数前的偶数变为奇数,然后一直往前找数进行操作2,显然无解。所以操作方案是唯一的。如果是偶数则不对其进行操作,依次往后递推。
代码实现:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 200010;
int n;
int w[N];
bool check()
{
for (int i = 0; i < n - 1; i ++ )
if (w[i] % 2)
w[i] --, w[i + 1] -- ;
for (int i = 0; i < n; i ++ )
if (w[i] < 0 || w[i] % 2)
return false;
return true;
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i ++ )
scanf("%d", &w[i]);
if (check()) puts("YES");
else puts("NO");
return 0;
}
Leetcode第312场周赛
第一题:2418. 按身高排序
分析:先写我自己的写的时候的思路。用vector定义一个pair数组,把heights和names都存到pair数组里面,sort函数对pair排序默认对first数据排序,所以直接对身高排序了,然后把排序后的names放到另一个vector数组中输出。
代码实现:
class Solution {
public:
vector<string> sortPeople(vector<string>& names, vector<int>& heights) {
vector<pair<int,string> > a;
int n = names.size();
for(int i = 0;i < n;i ++)a.push_back(make_pair(heights[i],names[i]));
sort(a.begin(),a.end());
vector<string> b;
for(int i = 0;i < n;i ++)b.push_back(a[i].second);
reverse(b.begin(),b.end());
return b;
}
分析:根据按位与运算的特性有 a AND b <= min(a, b)。题目要求子数组按位与结果最大,然后求最长子数组的长度。所以题目实际上求的是数组中的最大值最多连续出现了几次。思路参考
代码实现:
class Solution {
public:
int longestSubarray(vector<int>& nums) {
int n = nums.size();
// 求数组中的最大值
int mx = 0;
for (int x : nums) mx = max(mx, x);
// 统计该最大值最多连续出现几次
int ans = 1, cnt = 0;
for (int x : nums) {
if (x == mx) cnt++;
else ans = max(ans, cnt), cnt = 0;
}
ans = max(ans, cnt);
return ans;
}
};