Skip to content

2023‐02‐26 第 334 场周赛

Help edited this page Jul 16, 2023 · 1 revision
  • 第一题依旧是水题 直接按题目意思就能 A
class Solution {
public:
    vector<int> leftRigthDifference(vector<int>& nums) {
        vector<int> res;
        
        for (int i = 0; i < nums.size(); i ++) {
            int l = 0, r = 0;
            
            int k = i - 1, j = i + 1;
            
            while (k >= 0) l += nums[k], k --;
            
            while (j < nums.size()) r += nums[j], j ++;
            //for (int k = i - 1; i >= 0; i --) l += nums[k];
            
            //for (int j = i + 1; i < nums.size(); i ++) r += nums[j];
            
            res.push_back(abs(l - r));
        }
        
        return res;
    }
};
  • 这个题主要是处理数据溢出的问题 花费的时间比较多 而且罚了 4 次时
  • 最开始是直接模拟的 然后 int 溢出 改成 long long 后数据还是溢出 最后对数据的处理进行优化 但时间超时 最后才想到这个思路
  • 其实思路也不难想 就是对数据的溢出缺点想法
class Solution {
public:
    vector<int> divisibilityArray(string word, int m) { // 数据溢出 所以想模拟除法
        /*vector<int> res;
        
        vector<int> tem;
        
        long long f = 0, idx = 0; // 记录下标 被除数
        
        // 处理下标位置
        int w = m;
        
        while (w / 10) {
            w = w % 10;
            
            
            //w = w / 10;
            
            f ++;
        }
        
        f = f + 2 - 1 - 1;
        
        cout << "f: " << f << endl;
        
        for (int i = 0; i < f; i ++) tem.push_back(word[i] - '0'), res.push_back(0);
        
        for (int i = f; i < word.size(); i ++) {
            
            tem.push_back(word[i] - '0');
            
            idx = 0;
            
            // 模拟除法
            while (f < tem.size()) {
                idx = idx * 10 + tem[f]; // 被除数
                
                idx = idx % m;
                
                f ++;
                
            }
            
            if (idx == 0) res.push_back(1);
            
            else res.push_back(0);
        }*/
        vector<int> res;
        
        vector<int> tem;
        
        long long f = 0, idx = 0; // 记录下标 被除数
        
        for (int i = 0; i < word.size(); i ++) {
            idx = idx * 10 + (word[i] - '0');
                
            idx = idx % m;
            
            if (idx == 0) res.push_back(1);
            
            else res.push_back(0);
        }
        
        return res;
    }
};
  • 初次 A 到第三题 感觉应该可以上 1500
  • luck day
  • 正常处理就行 排序加贪心
class Solution {
public:
    int maxNumOfMarkedIndices(vector<int>& nums) {
        sort(nums.begin(), nums.end());
        
        vector<int> sma, big;
        
        int idx = nums.size() / 2;
        
        for (int i = 0; i < idx; i ++) sma.push_back(nums[i] * 2);
        
        for (int i = idx; i < nums.size(); i ++) big.push_back(nums[i]);
        
        int l = 0, r = 0;
        
        int res = 0;
        
        while (l < sma.size() && r < big.size()) {
            
            if (sma[l] <= big[r]) l ++, r ++, res ++;
            
            else r ++;
        }
        
        return res * 2;
    }
};