• leetcode 春季编程大赛-个人赛


    第一次打leetcode比赛,扑街...

    第一题:LCP 28. 采购方案

    解决方法:排序;对于每个元素,二分查找target-nums[i]

    class Solution {
    public:
        int purchasePlans(vector<int>& nums, int target) {
            int ans = 0;
            sort(nums.begin(), nums.end());
            for(auto it = nums.begin();it != nums.end();it++) {
                if(*it >= target)  break;
                int pos = upper_bound(nums.begin(), it, (target-(*it))) - nums.begin();
                // cout << *it << " " << pos << endl;
                ans = (ans + pos) % 1000000007;
            }
            return ans;
        }
    };

    第二题:LCP 29. 乐团站位

    解决方法:求出在第几圈;判断在上、下、左、右哪个方位;求出编号再取模。

    代码可以整理合并一下

    class Solution {
    public:
        int orchestraLayout(int num, int xPos, int yPos) {
        long long pos;
        long long len;
        if(xPos <= yPos) {
            if(xPos + yPos  <= num-1) {  // 1
                len = xPos;
                pos = 4*((num+1)*len - (1+len)*len);
                pos += yPos+1-len;
            } else {  // 2
                len = num - 1 - yPos;
                pos = 4*((num+1)*len - (1+len)*len);
                pos += num-2*len-1;
                pos += xPos+1-len;
            }
        } else {
            if(xPos + yPos >= num-1) {  // 3
                len = num - 1 - xPos;
                pos = 4*((num+1)*len - (1+len)*len);
                pos += (num-2*len-1)*2;
                pos += (num-yPos-len);
            } else { // 4
                len = yPos;
                pos = 4*((num+1)*len - (1+len)*len);
                pos += (num-2*len-1)*3;
                pos += num-xPos-len;
            }  // 2 2
        }
        int ans = pos % 9;
        if(ans == 0)  ans = 9;
        return ans;
        }
    };

    第三题:LCP 30. 魔塔游戏

    解决方法:和《加油站》那题类似,优先队列+贪心

    开long long,开long long,开long long

    class Solution {
    public:
        int magicTower(vector<int>& nums) {
            long long sum = 1;
            for(int num : nums)  sum += num;
            if(sum <= 0)  return -1;
    
            deque<int>mynums;
            for(int num : nums)  mynums.push_back(num);
    
            priority_queue<int>q;
            long long cur = 1;
            long long cnt = 0;
            while(!mynums.empty()) {
                int tmp = mynums.front();mynums.pop_front();
                // cout << tmp << endl;
                if(tmp >= 0) {
                    cur += tmp;
                } else {
                    cur += tmp;
                    q.push(-tmp);
    
                    while(cur <= 0 && (!q.empty())) {
                        int t = q.top();q.pop();
                        cur += t;
                        mynums.push_back(-t);
                        cnt++;
                    }
                }
                // cout << "cur: " << cur << endl;
            }
            return cnt;
        }
    };

    第四题:LCP 31. 变换的迷宫

    解决方法:记忆化搜索 yyds,dp[t][i][j][tmp][forever][used] 表示t时刻,(i, j)位置,tmp=1表示使用了临时卷轴,forever=1表示使用了永久卷轴,used=1表示处于使用了永久卷轴的地方

    参考https://leetcode-cn.com/problems/Db3wC1/comments/873211

    class Solution {
    public:
        bool dp[105][55][55][2][2][2];
        const int dx[4] = {-1, 0, 1, 0};
        const int dy[4] = {0, 1, 0, -1};
        int n, m, T;
        void dfs(int t, int i, int j, int tmp, int forever, int used, vector<vector<string>>& maze) {
            bool& ans = dp[t][i][j][tmp][forever][used];
            if(ans)  return;
            ans = true;
            if(t == T-1)  return;
            // 停在原地
            if(used)  dfs(t+1, i, j, tmp, forever, used, maze);
            if(maze[t+1][i][j] == '.') 
                dfs(t+1, i, j, tmp, forever, used, maze);
            else {
                if(tmp == 0)  dfs(t+1, i, j, 1, forever, used, maze);
                if(forever == 0)  dfs(t+1, i, j, tmp, 1, 1, maze);
            }
            // 四周走动
            for(int k = 0;k < 4;k++) {
                int xx = i+dx[k], yy = j+dy[k];
                if(xx >= 0 && xx < n && yy >= 0 && yy < m) {
                    if(maze[t+1][xx][yy] == '.')
                        dfs(t+1, xx, yy, tmp, forever, 0, maze);  // used改为0
                    else {
                        if(tmp == 0)
                            dfs(t+1, xx, yy, 1, forever, 0, maze);
                        if(forever == 0)
                            dfs(t+1, xx, yy, tmp, 1, 1, maze);
                    }
                }
            }
        }
        bool escapeMaze(vector<vector<string>>& maze) {
            T = maze.size();
            n = maze[0].size(), m = maze[0][0].size();
            dfs(0, 0, 0, 0, 0, 0, maze);
            for(int t = 0;t < T;t++)
                for(int tmp = 0;tmp < 2;tmp++)
                    for(int forever = 0;forever < 2;forever++)
                        for(int used = 0; used < 2;used++)
                            if(dp[t][n-1][m-1][tmp][forever][used])  return true;
    
            return false;
        }
    };

    第五题:LCP 32. 批量处理任务

    据说是经典题,略

    个性签名:时间会解决一切
  • 相关阅读:
    WindowsForm:百科
    App-应用程式:百科
    ASP.NET:目录
    ASP.NET:百科
    操作平台:.NET
    DB-触发器:百科
    DB-DatabaseLink:百科
    5090 众数
    计数排序
    归并排序
  • 原文地址:https://www.cnblogs.com/lfri/p/14628054.html
Copyright © 2020-2023  润新知