LeetCode 2020 Likou Cup National Autumn Programming Competition(656/3244、上位20.2%)

1.競技結果

2つの質問が行われ、3番目の質問は長い間書かれていて無駄でした。それでも強さが悪すぎるので、続けてください!

提出に成功した3244人の参加者がおり、656人がランク付けされています


最初のいくつかのボスが強すぎます!

トップ3ビッグブラザー

2.タイトル

1. LeetCode LCP 17.簡単な計算ロボット

トピックリンク

Xiaokouは秋の市場で迅速な計算ロボットを見つけました。ストアはロボットに2つの数値(xとyで示される)を伝えます。計算方法を教えてください。

「A」操作:make x = 2 * x + y;
「B」操作:make y = 2 * y + x
このゲームでは、店が話す数字はx = 1とy = 0です。Xiaokouが話す計算命令は、大文字のAとBで構成される文字列sとして記録されます。文字列内の文字の順序は計算を示します注文して、xとyの最終合計を返してください。

示例 1:
输入:s = "AB"
输出:4
解释:
经过一次 A 运算后,x = 2, y = 0。
再经过一次 B 运算,x = 2, y = 2。
最终 x 与 y 之和为 4。

提示:
0 <= s.length <= 10
s 由 'A''B' 组成

問題解決:

  • 質問に応じたシミュレーション
class Solution {
    
    
public:
    int calculate(string s) {
    
    
    	int x = 1, y = 0;
    	for(char c : s) 
    	{
    
    
    		if(c == 'A')
    			x = x*2+y;
    		else
    			y = y*2+x;
    	}
    	return x+y;
    }
};

2. LeetCode LCP 18.簡単な朝食コンボ

トピックリンク

Xiaokouは秋の市場で朝食の屋台を選択しました。各主食の価格は1次元整数配列の主食に記録され、各飲料の価格は1次元整数配列の飲み物に記録されています。
Xiaokouの計画は主食と飲料を選択し、コストはx元を超えません
少額控除で購入オプションの数を返してください。

注:答えは1e9 + 7(1000000007)を法とする必要があります。
たとえば、計算の初期結果は1000000008で、1を返します。

示例 1:
输入:staple = [10,20,5], drinks = [5,5,2], x = 15
输出:6
解释:小扣有 6 种购买方案,所选主食与所选饮料在数组中对应的下标分别是:
第 1 种方案:staple[0] + drinks[0] = 10 + 5 = 15;
第 2 种方案:staple[0] + drinks[1] = 10 + 5 = 15;
第 3 种方案:staple[0] + drinks[2] = 10 + 2 = 12;
第 4 种方案:staple[2] + drinks[0] = 5 + 5 = 10;
第 5 种方案:staple[2] + drinks[1] = 5 + 5 = 10;
第 6 种方案:staple[2] + drinks[2] = 5 + 2 = 7。

示例 2:
输入:staple = [2,1,1], drinks = [8,9,5,1], x = 9
输出:8
解释:小扣有 8 种购买方案,所选主食与所选饮料在数组中对应的下标分别是:
第 1 种方案:staple[0] + drinks[2] = 2 + 5 = 7;
第 2 种方案:staple[0] + drinks[3] = 2 + 1 = 3;
第 3 种方案:staple[1] + drinks[0] = 1 + 8 = 9;
第 4 种方案:staple[1] + drinks[2] = 1 + 5 = 6;
第 5 种方案:staple[1] + drinks[3] = 1 + 1 = 2;
第 6 种方案:staple[2] + drinks[0] = 1 + 8 = 9;
第 7 种方案:staple[2] + drinks[2] = 1 + 5 = 6;
第 8 种方案:staple[2] + drinks[3] = 1 + 1 = 2;

提示:
1 <= staple.length <= 10^5
1 <= drinks.length <= 10^5
1 <= staple[i],drinks[i] <= 10^5
1 <= x <= 2*10^5

問題解決:

  • 配列Aをソートし、別の配列Bをトラバースし、Aでバイナリ検索を見つけます。
class Solution {
    
    
public:
    int breakfastNumber(vector<int>& staple, vector<int>& drinks, int x) {
    
    
        sort(drinks.begin(), drinks.end());
        long long ans = 0, mod = 1e9+7;
        for(int stp : staple) 
        {
    
    
            if(stp >= x)
                continue;
            int target = x - stp;
            int pos = bs(drinks, target);
            if(pos != -1)
            {
    
    
                ans = (ans+pos+1)%mod;
            }
        }
        return ans;
    }
    int bs(vector<int>& arr, int target)
    {
    
    
        int l = 0, r = arr.size()-1, n = arr.size(), mid;
        while(l <= r)	//查找小于等于 target的最后一个数
        {
    
    
            mid = (l + r) / 2;
            if(arr[mid] > target)
            {
    
    
                r = mid-1;
            }
            else
            {
    
    
                if(mid == n-1 || arr[mid+1] > target)
                    return mid;
                else
                    l = mid+1;
            }
        }
        return -1;
    }
};

1164 ms 146.5 MB

  • または、二重ポインタで両方の配列をトラバースします
class Solution {
    
    
public:
    int breakfastNumber(vector<int>& staple, vector<int>& drinks, int x) {
    
    
    	sort(staple.begin(), staple.end());
    	sort(drinks.begin(), drinks.end());
    	long long ans = 0, mod = 1e9+7;
    	int m = staple.size(), n = drinks.size(), i, j;
        i = 0, j = n-1;
        while(i < m && j >= 0)
        {
    
    
            if(staple[i]+drinks[j] <= x)
            {
    
    
                ans = (ans+j+1)%mod;
                i++;
            }
            else
                j--;
        }
    	return ans;
    }
};

1368 ms 146.4 MB

3. LeetCode LCP 19.紅葉コレクションメディア

トピックリンク

Xiaokouは秋のツアーに出かけ、途中で赤と黄色の葉を集めました。彼はこれらの葉を使用して、事前に紅葉の葉のコレクションを編成しました。文字列の葉には小文字のrとyのみが含まれています。rは赤い葉を表し、yは文字yを表します黄色い葉。
Xiaokouは、美と清楚さのために、コレクション内の葉の配置を赤、黄、赤の3つの部分に調整したいと考えていました。各パーツの葉の数は同じでなくてもかまいませんが1以上でなければなりません
調整操作ごとに、小さなバックルで赤い葉を黄色い葉に、または黄色い葉を赤い葉に置き換えることができます。
月、私は聞いてどのように多くの調整作業がでXiaokouのために必要とされるために少なくとも紅葉コレクションを調整します。

示例 1:
输入:leaves = "rrryyyrryyyrr"
输出:2
解释:调整两次,将中间的两片红叶替换成黄叶,得到 "rrryyyyyyyyrr"

示例 2:
输入:leaves = "ryr"
输出:0
解释:已符合要求,不需要额外操作

提示:
3 <= leaves.length <= 10^5
leaves 中只包含字符 'r' 和字符 'y'

問題解決:

  • IKボスの DPを参照

  • dp[i][0]i赤色のR最小操作数をすべて終了することです

  • dp[i][1]最小操作数のi形成終わりRYを示します

  • dp[i][2]最小操作数のi形成終わりRYRを示します

class Solution {
    
    
public:
    int minimumOperations(string leaves) {
    
    
        int n = leaves.size(), i;
        vector<vector<int>> dp(n, vector<int>(3, INT_MAX));
        if(leaves[0]=='r')
            dp[0][0] = 0;
        else
            dp[0][0] = 1;//黄的改成红的
        if(leaves[1]=='y')
        {
    
    
            dp[1][0] = dp[0][0]+1;
            //全红      前面全红 + y改r
            dp[1][1] = dp[0][0];
            // RY     前面全红  + 当前y
        }
        else
        {
    
    
            dp[1][0] = dp[0][0];
            //全红     前面全红 ,当前也是红
            dp[1][1] = dp[0][0]+1;
            //RY      前面全红,当前r改y
        }
        if(leaves[2]=='r')
        {
    
    
            dp[2][0] = dp[1][0];
            dp[2][1] = min(dp[1][0]+1, dp[1][1]+1);
            dp[2][2] = dp[1][1];
        }
        else
        {
    
    
            dp[2][0] = dp[1][0]+1;
            dp[2][1] = min(dp[1][0], dp[1][1]);
            dp[2][2] = dp[1][1]+1;
        }
        for(i = 3; i < n; i++) 
        {
    
    
            if(leaves[i] == 'r')
            {
    
    
                dp[i][0] = dp[i-1][0];
                dp[i][1] = min(dp[i-1][0]+1, dp[i-1][1]+1);
                dp[i][2] = min(dp[i-1][1], dp[i-1][2]);
            }
            else
            {
    
    
                dp[i][0] = dp[i-1][0]+1;
                dp[i][1] = min(dp[i-1][1],dp[i-1][0]);
                dp[i][2] = min(dp[i-1][1]+1, dp[i-1][2]+1);
            }
        }
        return dp[n-1][2];
    }
};

704 ms 114.4 MB

4. LeetCode LCP20。BRTハード

トピックリンク


問題解決:

5. LeetCode LCP 21.ゲームをハードに追いかける

トピックリンク


問題解決:


私のCSDN ブログアドレスhttps://michael.blog.csdn.net/

QRコードを長押しまたはスキャンして、私の公式アカウント(Michael Amin)をフォローし、一緒に来て、学び、一緒に進歩してください!
マイケル・アミン

おすすめ

転載: blog.csdn.net/qq_21201267/article/details/108553304