2020力扣杯春季全国编程大赛个人向总结

第一题链接:拿硬币

在这里插入图片描述
第一题基本上算是白送的,只要进行奇偶判断就行

class Solution {
    
    
public:
    int minCount(vector<int>& coins) {
    
    
        int ans=0;
        for(int i=0;i<coins.size();i++)
        {
    
    
            if(coins[i]%2==0)
            {
    
    
                ans+=coins[i]/2;
            }
            else
            {
    
    
                ans+=coins[i]/2;
                ans++;
            }
        }
        return ans;
    }
};

第二题链接:传递信息

在这里插入图片描述在这里插入图片描述
第二题当时想到的就是利用邻接矩阵来做,居然还是能过了,难点主要是对于矩阵的幂运算,这里应该还能进行优化,但是直接提交还是能够双100%

class Solution {
    
    
public:
    vector<vector<int>> Mult(vector<vector<int>> a,vector<vector<int>> b) {
    
    
        int n = a.size(), m = a[0].size(), p = b[0].size();
        vector<vector<int> > result(n,vector<int>(n,0));
        for(int i=0; i<n; i++) {
    
    
            for(int j=0; j<p; j++) {
    
    
                for(int k=0; k<m; k++) {
    
    
                    result[i][j] += a[i][k] * b[k][j];
                }
            }
        }
        return result;
}
    int numWays(int n, vector<vector<int>>& relation, int k) {
    
    
        vector<vector<int>>g(n,vector<int>(n,0)),ans;
        for(int i=0;i<relation.size();i++)
        {
    
    
                g[relation[i][0]][relation[i][1]]++;
        }
        ans=g;
        for(int i=1;i<k;i++)
        {
    
    
           ans=Mult(ans,g);
        }
        return ans[0][n-1];
    }
};

第三题链接:剧情触发时间

在这里插入图片描述在这里插入图片描述在这里插入图片描述
这题当时没有想到用二分的方法来做,着实大意了,写完暴力模拟后才发现会超时,所以就卡住了:
先贴一个当时写的会超时的代码

class Solution {
    
    
public:
    vector<int> getTriggerTime(vector<vector<int>>& increase, vector<vector<int>>& requirements) {
    
    
        int C=0,R=0,H=0;
        vector<int> ans(requirements.size(),-1);
        int vis[100000]={
    
    0};
        int head=0,temp=1000000;
        for(int i=0;i<increase.size();i++)
        {
    
    
            C+=increase[i][0];
            R+=increase[i][1];
            H+=increase[i][2];
                for(int j=head;j<requirements.size();j++)
                {
    
    
                    
                    if(C>=requirements[j][0]&&R>=requirements[j][1]&&H>=requirements[j][2]&&!vis[j])
                    {
    
    
                         if(!i&&!j)
                        {
    
    
                            vis[j]=-2;
                            continue;
                        }
                        vis[j]=i+1;
                    }
                    temp=min(temp,j);
                }
            head=temp;
        }
        for(int i=0;i<requirements.size();i++)
        {
    
    
            if(vis[i]==-2)
            {
    
    
                ans[i]=0;
                continue;
            }
            if(vis[i])
            {
    
    
                ans[i]=vis[i];
            }
        }
        return ans;
    }
};

正确代码是:

class Solution {
    
    
public:
    vector<int> getTriggerTime(vector<vector<int>>& increase, vector<vector<int>>& requirements) {
    
    
        vector<vector<int>> s(increase.size()+1,vector<int>(3,0));
        for(int i=0;i<increase.size();i++){
    
    
            for(int j=0;j<3;j++){
    
    
                s[i+1][j] = s[i][j] + increase[i][j];
            }
        }
        vector<int> ans;
        for(auto v:requirements){
    
    
            int l=0, r = increase.size();
            while(l<r){
    
    
                int m = (l+r)/2;
                if(s[m][0]>=v[0]&&s[m][1]>=v[1]&&s[m][2]>=v[2])
                    r = m;
                else
                    l = m+1;
            }
            if(s[l][0]>=v[0]&&s[l][1]>=v[1]&&s[l][2]>=v[2])
                ans.push_back(l);
            else
                ans.push_back(-1);
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_43663263/article/details/105657162