力扣洛谷模拟题刷题2

总结

动态变化

转换状态(减少变量)

string反转:reverse(t.begin(),t.end());

2739. 总行驶距离

错误解法

cpp 复制代码
class Solution {
public:
    int distanceTraveled(int mainTank, int additionalTank) {
        int ans=0;
        while(mainTank){
            int s=mainTank/5;
            ans+=mainTank*10;
            mainTank=0;
            if(additionalTank){
                if(s<=additionalTank){
                    additionalTank-=s;
                    mainTank+=s;
                }
                else {
                    mainTank+=additionalTank;
                    additionalTank=0;
                }
            }
        }
        return ans;
    }
};

我把 mainTank 一次性全烧完了,再按 mainTank / 5 一次性补油

但题目的补油规则是:

每消耗 5 升主油箱油 ,且副油箱还有油时,立刻 转 1 升到主油箱。

也就是说:补进来的油可以立刻参与"消耗5升"的运算

所以推荐模拟做法

cpp 复制代码
class Solution {
public:
    int distanceTraveled(int mainTank, int additionalTank) {
        int ans=0;
        while(mainTank>=5){
            mainTank-=5;
            ans+=50;
            if(additionalTank){
                additionalTank--;
                mainTank++;
            }
        }
        return ans+mainTank*10;
    }
};

3546. 等和矩阵分割 I

S和T-S相等,转化为2*S=T

现在只要找S

注意开long long

cpp 复制代码
class Solution {
public:
    bool canPartitionGrid(vector<vector<int>>& grid) {
        long long total=0;
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[i].size();j++){
                total+=grid[i][j];
            }
        }
        long long sumA=0;
        for(int i=0;i<grid.size();i++){
            for(int j=0;j<grid[i].size();j++){
                sumA+=grid[i][j];
            }
            if(sumA*2==total)return true;
        }
        long long sumB=0;
        for(int i=0;i<grid[0].size();i++){
            for(int j=0;j<grid.size();j++){
                sumB+=grid[j][i];
            }
            if(sumB*2==total)return true;
        }
        return false;
    }
};

401. 二进制手表

cpp 复制代码
class Solution {
public:
    vector<string> readBinaryWatch(int turnedOn) {
        vector<string> ans;
        char s[6];
        for (uint8_t h = 0; h < 12; h++) {
            for (uint8_t m = 0; m < 60; m++) {
                if (popcount(h) + popcount(m) == turnedOn) {
                    sprintf(s, "%d:%02d", h, m);
                    ans.push_back(s);
                }
            }
        }
        return ans;
    }
};

注释版

cpp 复制代码
class Solution {
public:
    vector<string> readBinaryWatch(int turnedOn) {
        vector<string> ans;
        //结尾是'\0'
        char s[6];
        // uint8_t:无符号 8 位整数类型
        //用unsigned int也行(popcount函数接收无符号整型)
        for (unsigned int h = 0; h < 12; h++) {
            for (unsigned int m = 0; m < 60; m++) {
                // popcount(x):x 的二进制中有多少个 1
                //头文件:#include <bit>
                if (popcount(h) + popcount(m) == turnedOn) {
                    // sprintf 是 C 语言的字符串格式化函数
                    sprintf(s, "%d:%02d", h, m);
                    ans.push_back(s);
                }
            }
        }
        return ans;
    }
};

P1007 独木桥

重要思想:假设士兵碰面时交换灵魂

cpp 复制代码
#include<iostream>
using namespace std;
int main(){
    int L,n;
    cin>>L>>n;
    if(n==0){
        cout<<0<<" "<<0;
        return 0;
    }
    int t;
    int maxAns=-1;
    int minAns=-1;
    for(int i=0;i<n;i++){
        cin>>t;
        minAns=max(minAns,min(t-0,L+1-t));
        maxAns=max(maxAns,max(t-0,L+1-t));
    }
    cout<<minAns<<" "<<maxAns;
    return 0;
}

P1015 NOIP 1999 普及组 回文数

1、string反转:reverse(t.begin(),t.end());

2、模拟加法:carry和digit

3、toNum和toChar转化

cpp 复制代码
#include<iostream>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
int n;
string m;
int toNum(char c){
    if(c>='0'&&c<='9')return c-'0';
    else return c-'A'+10;
}
char toChar(int x){
    if(x>=0&&x<=9)return x+'0';
    else return x-10+'A';
}
bool jud(string m){
    int left=0;
    int right=m.size()-1;
    while(left<=right){
        if(m[left++]!=m[right--])return false;
    }
    return true;
}
string add(string a,string b){
    string ans="";
    int carry=0;
    for(int i=a.size()-1;i>=0;i--){
        int sum=toNum(a[i])+toNum(b[i])+carry;
        int digit=sum%n;
        carry=sum/n;
        ans+=toChar(digit);
    }
    if(carry)ans+=toChar(carry);
    reverse(ans.begin(),ans.end());
    return ans;
}
int main(){
    cin>>n>>m;
    for(int i=0;i<=30;i++){
        if(jud(m)){
            cout<<"STEP="<<i;
            return 0;
        }
        string t=m;
        reverse(t.begin(),t.end());
        m=add(t,m);
    }
    cout<<"Impossible!";
    return 0;
}

P1031 NOIP 2002 提高组 均分纸牌

贪心,往后传和往前传的公式是一样的

  1. 如果 ai>num,则 ai+1=ai+1+ai−num,ai=num;
  2. 如果 ai<num,则 ai+1=ai+1−num+ai,ai=num;
  3. 如果 ai=num,则不需要进行任何操作。
cpp 复制代码
#include<iostream>
#include<vector>
using namespace std;
int main(){
    int n;
    cin>>n;
    vector<int>s(n);
    int num=0;
    for(int i=0;i<n;i++){
        cin>>s[i];
        num+=s[i];
    }
    num/=n;
    int ans=0;
    for(int i=0;i<n-1;i++){
        if(s[i]!=num){
            s[i+1]+=s[i]-num;
            ans++;
        }
    }
    cout<<ans;
    return 0;
}
相关推荐
酉鬼女又兒几秒前
零基础入门计算机网络:物理层核心知识全解——传输方式分类、编码调制原理与信道极限容量计算
网络·计算机网络·考研·职场和发展·分类·数据挖掘·php
酉鬼女又兒6 分钟前
零基础入门计算机网络物理层:核心概念、传输媒体、传输方式、编码调制与信道极限容量完整知识点总结
开发语言·网络·计算机网络·考研·职场和发展·php·信息与通信
lightqjx6 分钟前
【算法】数据结构_单调栈
数据结构·算法·单调栈
Promise微笑8 分钟前
洞察无形:红外热像仪应用场景与高性价比之选
人工智能·物联网·算法
8Qi813 分钟前
LeetCode 746:使用最小花费爬楼梯 —— 题解笔记
java·笔记·算法·leetcode·动态规划
pipo17 分钟前
没雷达也能调 Nav2?我开源了一套仿真到实机复用的 ROS 2 3D LiDAR 导航工作空间
算法
计算机安禾23 分钟前
【算法分析与设计】第44篇:随机化复杂度类:RP、BPP与去随机化猜想
java·数据结构·数据库·算法·机器学习
程序员三藏30 分钟前
接口测试用例设计
自动化测试·软件测试·python·测试工具·职场和发展·测试用例·接口测试
计算机安禾32 分钟前
【算法分析与设计】第45篇:交互式证明系统与零知识证明
算法·区块链·零知识证明
自进化Agent智能体35 分钟前
Hermes架构全景图:从入口到交付的完整数据流
算法