首页 > 其他分享 >第341场周赛

第341场周赛

时间:2023-04-16 20:01:06浏览次数:29  
标签:周赛 return cur int graph vector 341 res

1. 一最多的行

送分题
class Solution {
public:
    vector<int> rowAndMaximumOnes(vector<vector<int>>& mat) {
        int m =mat.size(); int n = mat[0].size();
        int res = 0;
        int index = 0;
        for(int i=0;i<m;i++){
            int count = 0;
            for(int j=0;j<n;j++){
                if(mat[i][j]==1) count++;
            }
            if(count>res){res = count; index = i;}
        }
        return {index,res};
    }
};

2. 找出可除性得分最大的整数

送分题
class Solution {
public:
    int maxDivScore(vector<int>& nums, vector<int>& divisors) {
        sort(nums.begin(),nums.end());
        int res = 0;
        int num = divisors[0];
        for(int i=0;i<divisors.size();i++){
            int score = 0;
            for(int j=0;j<nums.size();j++){
                if(nums[j]%divisors[i]==0) score++;
            }
            if(score>res){res=score; num = divisors[i];}
            else if(score==res&&divisors[i]<num) num = divisors[i] ;
        }
        return num;
    }
};

3. 构造有效字符串的最少插入数

拆分问题+递归子字符串
class Solution {
public:
    int addMinimum(string word) {
        if(word.size()==0) return 0;
        else if(word.size()==1) return 2;
        if(word[0]<word[1]){
            if(word.size()==2) return 1;
            else if(word[1]<word[2]) return addMinimum(word.substr(3));
            else return 1+addMinimum(word.substr(2));
        }
        else return 2+addMinimum(word.substr(1));
    }
    
};

4. 最小化旅行的价格总和

分析:选择不相邻节点减半价格并最小化价格
涉及到图的选择的问题,考虑使用回溯法,选择为当前节点减半或者不减半,并递归搜索相邻节点
不过该题首先要知道哪些点走了几次,可以根据路径选择事先用回溯法得到每个点的访问次数
然后根据访问次数与价格生成权重,使用权重做后面的减半回溯搜索,找到最小化解

class Solution {
public:
    vector<vector<int>> graph;//无向邻接表
    vector<int> cnt;//走完指定路径每个点通过的次数
    vector<int> weight;//顶点的代价
    bool confirm;
    int minimumTotalPrice(int n, vector<vector<int>>& edges, vector<int>& price, vector<vector<int>>& trips) {
        graph.resize(n);
        for (auto& edge : edges) {//初始化
            int from = edge[0];
            int to = edge[1];
            graph[from].push_back(to);
            graph[to].push_back(from);
        }

        cnt.resize(n);
        for (auto& edge : trips) {//用路径初始化经过点的次数
            int from = edge[0];
            int to = edge[1];
            confirm = 0;//当前路径是否找到
            dfs(from, to, -1);//根据起点终点对经过的点计数
        }
        weight.resize(n);
        for (int i = 0; i < n; i++) 
            weight[i] = cnt[i] * price[i];//计算某顶点的代价
        int res = reduce(0, 0, -1);//再次深度优先计算最小路径和
        return res;
    }
    void dfs(int start, int end, int from) {//计算经过各顶点的次数
        if(start==end){cnt[end]++; confirm = 1; return;}
        if (confirm) return;//如果其他路径找到了,就不需要再找了,直接剪枝
        cnt[start]++;//选择当前路径,计数起点

        int n = graph[start].size();
        for (int i = 0; i < n; i++) {
            if (graph[start][i] == from) continue;//不从原路返回
            dfs(graph[start][i], end, start);//选择下一个节点作为起始节点
        }
        if (confirm) return;//当前路径找到了,不需要再撤回
        cnt[start]--;//撤销选择
    }
    long reduce(bool before, int cur, int from) {
        int n = graph[cur].size();
        if (n == 1 && graph[cur][0] == from) {//边界条件,只有一条边,且刚从那边过来
            if (before == 0) return weight[cur] / 2;
            else return weight[cur];
        }
        //权重为0无所谓区不区分,全按不减半处理
        if(weight[cur]==0) {
            int res = 0;
            for (int i = 0; i < n; i++) {//当前节点减半
                if (graph[cur][i] == from) continue;
                res += reduce(0, graph[cur][i], cur);
            }
            return res;
        } 
        //当前节点减半
        int half = INT_MAX;
        if (before == 0) {//前一个节点没有减半
            half = weight[cur] / 2;
            for (int i = 0; i < n; i++) {//当前节点减半
                if (graph[cur][i] == from) continue;
                half += reduce(1, graph[cur][i], cur);
            }
        }
        //当前节点全值
        int total = weight[cur];//当前节点不减半
        for (int i = 0; i < n; i++) {
            if (graph[cur][i] == from) continue;
            total += reduce(0, graph[cur][i], cur);
        }
        return min(half, total);
 } 
};

标签:周赛,return,cur,int,graph,vector,341,res
From: https://www.cnblogs.com/929code/p/17323923.html

相关文章

  • LeetCode 双周赛 102,模拟 / BFS / Dijkstra / Floyd
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,欢迎来到小彭的LeetCode周赛解题报告。昨晚是LeetCode双周赛第102场,你参加了吗?这场比赛比较简单,拼的是板子手速,继上周掉大分后算是回了一口血......
  • kuangbin专题一 简单搜索 罐子(POJ-3414)
    PotsTimeLimit:1000MS MemoryLimit:65536KDescriptionYouaregiventwopots,havingthevolumeofAandBlitersrespectively.Thefollowingoperationscanbeperformed:FILL(i)fillthepoti(1≤i≤2)fromthetap;DROP(i)emptythep......
  • LeetCode 周赛 340,质数 / 前缀和 / 极大化最小值 / 最短路 / 平衡二叉树
    本文已收录到AndroidFamily,技术和职场问题,请关注公众号[彭旭锐]提问。大家好,我是小彭。上周跟大家讲到小彭文章风格的问题,和一些朋友聊过以后,至少在算法题解方面确定了小彭的风格。虽然竞赛算法题的文章受众非常小,但却有很多像我一样的初学者,他们有兴趣参加但容易被题目难......
  • CodeStar2023年春第4周周赛普及奠基组
    T1:字符串加密(二)本题难度简单,是一个模拟题,注意\(k\)可能非常大,需要先模\(26\)。代码实现#include<bits/stdc++.h>usingnamespacestd;usingll=longlong;intmain(){stringm;cin>>m;llk;cin>>k;k%=26;stringans;......
  • AcWing 第 98 场周赛 ABC
    https://www.acwing.com/activity/content/competition/problem_list/3128/4947.大整数题目大意:给定n,k。输出n个k。输入样例:32输出样例:222#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLMAXN=1e18,MINN=-M......
  • CodeStar2023年春第3周周赛普及奠基组
    T1:字符串加密本题难度简单,根据题目描述模拟即可。代码实现#include<bits/stdc++.h>usingnamespacestd;intmain(){strings;cin>>s;for(char&c:s){if(islower(c))c-=32;elsec+=32;}reverse(s.beg......
  • COMP3411/9814 人工智能
    COMP3411/9814ArtificialIntelligenceTerm1,2023Assignment3–PlanningandMachineLearningDue:Week10-10pmFriday21AprilMarks:10%offinalassessmentforCOMP3411/9814ArtificialIntelligenceQuestion1:Planning(4marks)Modifythesimpleplanner......
  • 校周赛-我左看右看上看下看 原来每个排列都不简单
    题目描述ABCDEFGBABCDEFCBABCDEDCBABCDEDCBABC这是一个5行7列的图形,请找出这个图形的规律,并输出一个n行m列的图形。输入格式输入一行,包含两个整数n和m,分别表示你要输出的图形的行数的列数。输出格式输出n行,每个m个字符,为你的图形。样例......
  • AcWing第97场周赛复盘总结
    4944.热身计算-AcWing题库给定两个正整数$a,b$,请你分别计算$\min(a,b)$以及$\lfloor\frac{|a-b|}{2}\rfloor$的值。$\lfloor\frac{|a-b|}{2}\rfloor$表示不大于$\frac{|a-b|}{2}$的最大整数。输入格式共一行,包含两个正整数$a,b$。输出格式共一......
  • AcWing 第 97 场周赛 ABC(dfs)
    https://www.acwing.com/activity/content/competition/problem_list/3088/果然绩点成绩和竞赛水平总得寄一个(tome4944.热身计算#include<bits/stdc++.h>usingnamespacestd;typedeflonglongLL;typedefpair<LL,LL>PII;constLLMAXN=1e18,MINN=-MAXN,INF=0x3f3f3......