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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值