首页 > 其他分享 >2024寒假集训 进阶训练赛 (六)部分题解

2024寒假集训 进阶训练赛 (六)部分题解

时间:2024-01-23 23:57:12浏览次数:33  
标签:distance 进阶 int 题解 2024 加油站 ans include scanner

A 统计单词数

题解

注意是否是单词。

CODE

CPP
#include<iostream>
#include<string>
#include<algorithm>

using namespace std;

int main() {
    string word, article;
    getline(cin, word);
    getline(cin, article);

    // 转换为小写字母
    transform(word.begin(), word.end(), word.begin(), ::tolower);
    transform(article.begin(), article.end(), article.begin(), ::tolower);

    int count = 0;
    int pos = -1;
    size_t start = 0;
    while ((start = article.find(word, start)) != string::npos) {
        // 确保找到的单词是独立的
        if ((start == 0 || !isalpha(article[start - 1])) &&
            (start + word.length() == article.length() || !isalpha(article[start + word.length()]))) {
            count++;
            if (pos == -1) {
                pos = start;
            }
        }
        start += word.length();
    }

    if (count > 0) {
        cout << count << " " << pos << endl;
    } else {
        cout << -1 << endl;
    }

    return 0;
}
PYTHON
def find_word(word, article):
    count = 0
    position = -1
    words = article.split()
    for i in range(len(words)):
        if words[i].lower() == word.lower():
            count += 1
            if position == -1:
                position = article.index(words[i])
    if count > 0:
        return f"{count} {position}"
    else:
        return -1

word = input()
article = input()
result = find_word(word, article)
print(result)
JAVA
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String word = sc.nextLine().toLowerCase(); // 给定的单词转为小写
        String article = sc.nextLine();

        int count = 0; // 计数器,记录单词出现的次数
        int position = -1; // 记录单词第一次出现的位置,默认为-1
        int index = 0; // 当前搜索的位置

        // 在文章中循环查找单词
        while (index < article.length()) {
            // 找到单词的第一个字符出现的位置
            int start = article.toLowerCase().indexOf(word, index);

            // 如果找到了单词
            if (start != -1) {
                // 如果该单词是一个独立的单词,即其前后字符都不是字母
                if ((start == 0 || !Character.isLetter(article.charAt(start - 1))) &&
                        (start + word.length() == article.length() ||
                                !Character.isLetter(article.charAt(start + word.length())))) {
                    count++;
                    // 如果是第一次找到单词,记录位置
                    if (position == -1) {
                        position = start;
                    }
                }
                // 更新搜索的位置
                index = start + word.length();
            } else {
                break;
            }
        }

        // 输出结果
        if (count == 0) {
            System.out.println(-1);
        } else {
            System.out.println(count + " " + position);
        }
    }
}

B 单词替换

题解

注意判断是否是单词。

CODE

CPP
#include <iostream>
#include <string>

using namespace std;

string replaceWord(string s, string a, string b) {
    size_t pos = s.find(a); // 找到待替换单词的位置
    while (pos != string::npos) {
        s.replace(pos, a.length(), b); // 替换单词
        pos = s.find(a, pos + b.length());
    }
    return s;
}

int main() {
    string s, a, b;
    getline(cin, s);
    getline(cin, a);
    getline(cin, b);

    string replacedString = replaceWord(s, a, b);

    cout << replacedString << endl;

    return 0;
}
PYTHON
s = input().strip()
a = input().strip()
b = input().strip()

result = s.replace(a, b)
print(result)
JAVA
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String s = scanner.nextLine();
        String a = scanner.nextLine();
        String b = scanner.nextLine();

        String replacedString = s.replace(a, b);
        System.out.println(replacedString);
    }
}

C 生日相同

题解

以生日为键,保存相同生日的同学的姓名,再将姓名排序输出。

CODE

CPP
#include <iostream>
#include <vector>
#include <map>
#include <algorithm>

using namespace std;

// 学生结构体
struct Student {
    string name;
    int month;
    int day;
};

// 比较函数,用于sort排序
bool compare(const string& s1, const string& s2) {
    if (s1.length() != s2.length()) {
        return s1.length() < s2.length();
    } else {
        return s1 < s2;
    }
}

int main() {
    int n;
    cin >> n;

    // 使用map来存储生日相同的学生
    map<pair<int, int>, vector<string>> birthdayMap;

    for (int i = 0; i < n; i++) {
        string name;
        int month, day;
        cin >> name >> month >> day;
        
        // 将学生信息存入map中
        birthdayMap[make_pair(month, day)].push_back(name);
    }

    // 判断是否存在生日相同的学生
    int sz = birthdayMap.size();
    if (sz == n) {
        cout << "None" << endl;
    } else {
        // 遍历map输出结果
        for (auto pair : birthdayMap) {
            if (pair.second.size() == 1) continue;
            // 输出生日相同的学生
            cout << pair.first.first << " " << pair.first.second << " ";

            // 对学生名字进行排序
            sort(pair.second.begin(), pair.second.end(), compare);

            // 输出学生名字
            for (string& name : pair.second) {
                cout << name << " ";
            }

            cout << endl;
        }
    }

    return 0;
}
PYTHON
# 输入学生数量
n = int(input())
students = []
# 读取每个学生的信息
for _ in range(n):
    name, month, day = input().split()
    month, day = int(month), int(day)
    students.append((name, month, day))

# 按照月份、日期、名字的长度和名字的字典顺序对学生进行排序
students.sort(key=lambda x: (x[1], x[2], len(x[0]), x[0]))

birthday_dict = {}
# 遍历排序后的学生列表
for name, month, day in students:
    # 如果学生的生日还没有在字典中,就在字典中为这个生日创建一个空列表
    if (month, day) not in birthday_dict:
        birthday_dict[(month, day)] = []
    # 将学生的名字添加到这个生日对应的列表中
    birthday_dict[(month, day)].append(name)

# 按照日期的顺序遍历字典中的每个条目
for key in sorted(birthday_dict.keys()):
    # 如果一个生日有多于一个的学生,就打印出这个日期和所有在这一天出生的学生的名字
    if len(birthday_dict[key]) > 1:
        print(key[0], key[1], *birthday_dict[key])


JAVA
import java.util.*;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        // 创建一个扫描器来读取输入
        Scanner scanner = new Scanner(System.in);
        // 读取学生的数量
        int n = scanner.nextInt();
        scanner.nextLine();

        // 创建一个映射来存储每个生日的学生列表
        Map<String, List<String>> birthdayMap = new TreeMap<>();
        for (int i = 0; i < n; i++) {
            // 读取学生的名字、出生月份和日期
            String[] student = scanner.nextLine().split(" ");
            String name = student[0];
            String birthday = student[1] + " " + student[2];

            // 如果这个生日还没有在映射中,就在映射中为这个生日创建一个空列表
            if (!birthdayMap.containsKey(birthday)) {
                birthdayMap.put(birthday, new ArrayList<>());
            }
            // 将学生的名字添加到这个生日对应的列表中
            birthdayMap.get(birthday).add(name);
        }

        // 按照日期的顺序遍历映射中的每个条目
        for (String birthday : birthdayMap.keySet()) {
            // 获取这个生日的学生列表
            List<String> names = birthdayMap.get(birthday);
            // 如果一个生日有多于一个的学生
            if (names.size() > 1) {
                // 按照名字的长度和字典顺序对名字进行排序
                names.sort(Comparator.comparing(String::length).thenComparing(String::compareTo));
                // 打印出这个日期和所有在这一天出生的学生的名字
                System.out.println(birthday + " " + String.join(" ", names));
            }
        }
    }
}

D 编程实现进制转换

题解

二进制使用除2取余,逆序排列。八进制和十六进制使用已有的函数方法。

CODE

CPP
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 将整数转换为二进制的函数
string toBinary(int N) {
    if (N == 0) return "0";
    bool neg = (N < 0 ? 1 : 0);
    if (neg) {
        N *= -1;
    }
    vector<int> binary;
    while (N) {
        binary.push_back(N % 2);
        N /= 2;
    }
    reverse(binary.begin(), binary.end());
    string binaryStr = "";
    if (neg) {
        binaryStr = "-";
    }
    for (int i : binary) {
        binaryStr += to_string(i);
    }
    return binaryStr;
}

int main() {
    int N;
    cin >> N;

    bool neg = (N < 0 ? 1 : 0);
    // 输出二进制
    cout << toBinary(N) << " ";
    // 输出八进制
    if (neg) {
        cout << "-";
        N *= -1;
    }
    cout << oct << N << " ";
    // 输出十六进制
    if (neg) {
        cout << "-";
    }
    cout << hex << N << endl;

    return 0;
}

PYTHON
def convert_to_bases(N):
    # 转换为二进制
    binary = bin(N)[2:] if N >= 0 else "-" + bin(N)[3:]
    # 转换为八进制
    octal = oct(N)[2:] if N >= 0 else "-" + oct(N)[3:]
    # 转换为十六进制
    hexadecimal = hex(N)[2:] if N >= 0 else "-" + hex(N)[3:]
    return binary, octal, hexadecimal

N = int(input())
binary, octal, hexadecimal = convert_to_bases(N)
print(binary, octal, hexadecimal)
JAVA
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();

        // 转换为二进制
        String binary = N >= 0 ? Integer.toBinaryString(N) : "-" + Integer.toBinaryString(-N);
        // 转换为八进制
        String octal = N >= 0 ? Integer.toOctalString(N) : "-" + Integer.toOctalString(-N);
        // 转换为十六进制
        String hexadecimal = N >= 0 ? Integer.toHexString(N) : "-" + Integer.toHexString(-N);

        System.out.println(binary + " " + octal + " " + hexadecimal);
    }
}

E Stones

题意

由于自行车的状态不对,Sempr 开始每天早上从东边走到西边,晚上再走回来。走着走着可能会有点累,所以森普尔总是在这个时候玩一些游戏。
路上有很多石头,当他遇到一块石头时,如果是单数石头,他会把它扔得越远越好,如果是双数石头,他会把它留在原地。现在给你一些关于路上石头的信息,你要告诉我 Sempr 走过之后,从起点到最远的石头的距离。请注意,如果两块或两块以上的石头停留在同一位置,你会先遇到较大的那块(如输入中描述的 Di 最小的那块)。

题解

由于单数石头被踢后后续还是会再遇到,我们需要动态取距离sempr最近的石头,可以使用堆(优先队列)来完成这种操作。

CODE

CPP
#include <iostream>
#include <queue>
#include <vector>

using namespace std;

// 自定义比较函数,用于优先队列
struct compare {
    bool operator()(pair<int, int> a, pair<int, int> b) {
        if(a.first == b.first) return a.second > b.second;  // 如果位置相同,投掷距离小的在前
        return a.first > b.first;  // 位置小的在前
    }
};

int main() {
    int T;  // 测试用例数量
    cin >> T;
    while (T -- ) {
        priority_queue<pair<int, int>, vector<pair<int, int>>, compare> pq;  // 存储石头信息的优先队列
        int n;  // 石头数量
        cin >> n;
        for (int i = 0;i < n;i++) {
            int a, b;  // 石头的位置和投掷距离
            cin >> a >> b;
            pq.push({a,b});  // 将石头信息添加到优先队列中
        }
        long long ans = 0;  // 最远石头的距离
        int odd = 1;  // 是否为奇数个石头
        while (!pq.empty()) {
            auto x = pq.top();  // 取出队列顶部的石头
            pq.pop();
            if (odd) {  // 如果是奇数个石头,就投掷
                pq.push({x.first + x.second, x.second});  // 投掷后的石头再放回队列中
            } else {  // 如果是偶数个石头,就更新最远距离
                ans = max(ans, x.first*1ll);
            }
            odd = 1 - odd;  // 更新奇偶标记
        }
        cout << ans << "\n";  // 输出最远石头的距离
    }
    return 0;
}

PYTHON
import heapq

T = int(input())
for _ in range(T):
    n = int(input())
    stones = []
    for _ in range(n):
        a, b = map(int, input().split())
        stones.append((a, b))
    # 使用堆来实现优先队列,堆顶元素总是最小的元素
    heap = []
    for stone in stones:
        heapq.heappush(heap, stone)
    ans = 0
    odd = True
    while heap:
        x = heapq.heappop(heap)  # 取出堆顶元素
        if odd:  # 如果是奇数个石头,就投掷
            heapq.heappush(heap, (x[0] + x[1], x[1]))  # 投掷后的石头再放回堆中
        else:  # 如果是偶数个石头,就更新最远距离
            ans = max(ans, x[0])
        odd = not odd  # 更新奇偶标记
    print(ans)  # 输出最远石头的距离

JAVA
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);  // 创建扫描器读取输入
        int T = scanner.nextInt();  // 读取测试用例数量
        for (int t = 0; t < T; t++) {
            int n = scanner.nextInt();  // 读取每个测试用例的石头数量
            // 创建优先队列,存储石头信息,先按位置排序,位置相同则按投掷距离排序
            PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> a[0] != b[0] ? a[0] - b[0] : a[1] - b[1]);
            for (int i = 0; i < n; i++) {
                int a = scanner.nextInt();  // 读取石头的位置
                int b = scanner.nextInt();  // 读取石头的投掷距离
                pq.offer(new int[]{a, b});  // 将石头信息添加到优先队列中
            }
            long ans = 0;  // 初始化最远石头的距离
            boolean odd = true;  // 初始化奇偶标记,true表示奇数
            while (!pq.isEmpty()) {
                int[] x = pq.poll();  // 从优先队列中取出队首的石头
                if (odd) {  // 如果是奇数个石头,就投掷
                    pq.offer(new int[]{x[0] + x[1], x[1]});  // 投掷后的石头再放回队列中
                } else {  // 如果是偶数个石头,就更新最远距离
                    ans = Math.max(ans, x[0]);
                }
                odd = !odd;  // 更新奇偶标记
            }
            System.out.println(ans);  // 输出最远石头的距离
        }
        scanner.close();  // 关闭扫描器
    }
}

F Expedition

题解

对于当前燃料能走到的所有地方,如果没有终点,说明必须得加油,显然,最优的方案就是选择加油量最多的进行加油,然后再判断能否到达终点,再不能就还得再加油,以此类推,直到到达终点。

CODE

CPP
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;

// 定义一个结构体,表示加油站
struct Station {
    int distance;  // 加油站到城镇的距离
    int fuel;      // 加油站的燃油量
};

// 比较函数,用于对加油站按照距离进行排序
bool cmp(const Station &a, const Station &b) {
    return a.distance < b.distance;
}

int main() {
    int N, L, P;
    cin >> N;  // 输入加油站的数量
    vector<Station> stations(N);  // 创建一个向量来存储所有的加油站
    for (int i = 0; i < N; i++) {
        cin >> stations[i].distance >> stations[i].fuel;  // 输入每个加油站的信息
    }
    cin >> L >> P;  // 输入卡车到城镇的距离和卡车的初始燃油量
    for (int i = 0; i < N; i++) {
        stations[i].distance = L - stations[i].distance;  // 计算每个加油站到卡车的距离
    }
    sort(stations.begin(), stations.end(), cmp);  // 对加油站按照距离进行排序
    stations.push_back({L, 0});  // 将城镇作为一个加油站添加到向量中
    priority_queue<int> pq;  // 创建一个优先队列来存储可以到达的加油站的燃油量
    int ans = 0, pos = 0, tank = P;  // 初始化答案,当前位置和燃油箱的燃油量
    for (int i = 0; i <= N; i++) {
        int d = stations[i].distance - pos;  // 计算到下一个加油站的距离
        while (tank - d < 0) {  // 如果燃油不足以到达下一个加油站
            if (pq.empty()) {  // 如果没有可以到达的加油站
                cout << -1 << endl;  // 输出-1
                return 0;
            }
            tank += pq.top();  // 在燃油量最大的加油站加油
            pq.pop();  // 从优先队列中移除这个加油站
            ans++;  // 增加停靠的加油站数量
        }
        tank -= d;  // 更新燃油量
        pos = stations[i].distance;  // 更新当前位置
        pq.push(stations[i].fuel);  // 将当前加油站的燃油量添加到优先队列中
    }
    cout << ans << endl;  // 输出最少的停靠加油站数量
    return 0;
}
PYTHON
import heapq

# 定义一个类,表示加油站
class Station:
    def __init__(self, distance, fuel):
        self.distance = distance  # 加油站到城镇的距离
        self.fuel = fuel  # 加油站的燃油量

N = int(input())  # 输入加油站的数量
stations = []  # 创建一个列表来存储所有的加油站
for _ in range(N):
    d, f = map(int, input().split())  # 输入每个加油站的信息
    stations.append(Station(d, f))

L, P = map(int, input().split())  # 输入卡车到城镇的距离和卡车的初始燃油量

for i in range(N):
    stations[i].distance = L - stations[i].distance

# 将加油站按照距离进行排序
stations.sort(key=lambda s: s.distance)

# 将城镇作为一个加油站添加到列表中
stations.append(Station(L, 0))

pq = []  # 创建一个优先队列来存储可以到达的加油站的燃油量
ans = 0  # 初始化答案
pos = 0  # 初始化当前位置
tank = P  # 初始化燃油箱的燃油量

for i in range(N+1):
    d = stations[i].distance - pos  # 计算到下一个加油站的距离

    # 如果燃油不足以到达下一个加油站
    while tank - d < 0:
        if not pq:  # 如果没有可以到达的加油站
            print(-1)  # 输出-1
            exit(0)

        tank += -heapq.heappop(pq)  # 在燃油量最大的加油站加油
        ans += 1  # 增加停靠的加油站数量

    tank -= d  # 更新燃油量
    pos = stations[i].distance  # 更新当前位置
    heapq.heappush(pq, -stations[i].fuel)  # 将当前加油站的燃油量添加到优先队列中

print(ans)  # 输出最少的停靠加油站数量

JAVA
import java.util.*;

// 定义一个类,表示加油站
class Station implements Comparable<Station> {
    int distance;  // 加油站到城镇的距离
    int fuel;      // 加油站的燃油量

    // 构造函数
    public Station(int distance, int fuel) {
        this.distance = distance;
        this.fuel = fuel;
    }

    // 实现Comparable接口的compareTo方法,用于比较两个加油站的燃油量
    public int compareTo(Station other) {
        return other.fuel - this.fuel;
    }
}

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();  // 输入加油站的数量
        Station[] stations = new Station[N+1];  // 创建一个数组来存储所有的加油站
        for (int i = 0; i < N; i++) {
            int distance = scanner.nextInt();
            int fuel = scanner.nextInt();
            stations[i] = new Station(distance, fuel);  // 输入每个加油站的信息
        }
        int L = scanner.nextInt();  // 输入卡车到城镇的距离
        int P = scanner.nextInt();  // 输入卡车的初始燃油量
        stations[N] = new Station(L, 0);  // 将城镇作为一个加油站添加到数组
        for (int i = 0; i < N; i++) {
            stations[i].distance = L - stations[i].distance;  // 输入每个加油站的信息
        }
        Arrays.sort(stations, (a, b) -> a.distance - b.distance);  // 对加油站按照距离进行排序

        PriorityQueue<Station> pq = new PriorityQueue<>();  // 创建一个优先队列来存储可以到达的加油站
        int ans = 0, pos = 0, tank = P;  // 初始化答案,当前位置和燃油箱的燃油量
        for (int i = 0; i <= N; i++) {
            int d = stations[i].distance - pos;  // 计算到下一个加油站的距离
            while (tank - d < 0) {  // 如果燃油不足以到达下一个加油站
                if (pq.isEmpty()) {  // 如果没有可以到达的加油站
                    System.out.println(-1);  // 输出-1
                    return;
                }
                tank += pq.poll().fuel;  // 在燃油量最大的加油站加油
                ans++;  // 增加停靠的加油站数量
            }
            tank -= d;  // 更新燃油量
            pos = stations[i].distance;  // 更新当前位置
            if (i < N) pq.offer(stations[i]);  // 将当前加油站的燃油量添加到优先队列中
        }
        System.out.println(ans);  // 输出最少的停靠加油站数量
    }
}

G 【蓝桥杯2021初赛】货物摆放

题解

由于是乘法,考虑n的因子,对因子进行排列组合,得到所有可能的方案。

CODE

CPP
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

// 找出所有因子
vector<long long> factors(long long n) {
    vector<long long> f;
    for (long long i = 1; i <= n / i; ++i) {
        if (n % i == 0) {
            f.push_back(i);
            if (i * i != n) {
                f.push_back(n / i);
            }
        }
    }
    return f;
}

// 计算所有可能的组合数量
long long count_combinations(const vector<long long>& f) {
    long long count = 0;
    for (size_t i = 0; i < f.size(); ++i) {
        for (size_t j = 0; j < f.size(); ++j) {
            if (binary_search(f.begin(), f.end(), f[i] * f[j])) {
                ++count;
            }
        }
    }
    return count;
}

int main() {
    long long n = 2021041820210418;
    vector<long long> f = factors(n);
    sort(f.begin(), f.end());
    cout << count_combinations(f) << endl;
    return 0;
}

H 【蓝桥杯2021初赛】砝码称重

题解

动态规划,对于现在已经知道的能凑成的数字num,新加入一个砝码x可能会凑出新的数字,这些可能的数字是x,x+num、abs(x - num)。

CODE

CPP
#include <iostream>
#include <numeric>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int N;
    cin >> N;
    vector<int> W(N);
    for (int i = 0; i < N; ++i) {
        cin >> W[i];
    }

    int sum = accumulate(W.begin(), W.end(), 0);
    vector<bool> dp( sum+2,0);
    for (int i = 0;i < N;i++) {
        vector<bool> tdp(sum+2,0);  // 加入第i个砝码后的答案数组
        for (int j = 0;j <= sum;j++) {
            if (W[i] == j) tdp[j] = 1;  // 能凑成x
            else {
                tdp[j] = dp[abs(j - W[i])] | dp[j]; // 原来就能凑出或abs(x-num)
                if (j + W[i] <= sum) tdp[j] = dp[j + W[i]] | tdp[j];    // x+num
            }
        }
        dp = move(tdp); // 更新
    }
    cout << count(dp.begin() + 1, dp.end(), true) << endl;
    return 0;
}

I 最小值-2019

题解

由于(i * j) % 2019等价于(i % 2019 * j % 2019) % 2019,因此一旦区间长度超过2019,答案就是0,不超过的话就可以遍历所有情况,找最小值。

CODE

CPP
#include <iostream>
#include <numeric>
#include <vector>
#include <algorithm>

using namespace std;

int main() {
    int l, r;
    cin >> l >> r; // 读取区间的左右边界

    // 如果区间长度大于等于2019,那么一定可以找到两个数i和j,使得i*j mod 2019为0
    if (r - l >= 2019) {
        cout << 0 << "\n";
        return 0;
    }

    // 初始化答案为2018,因为i*j mod 2019的最大值不会超过2018
    int ans = 2018;

    // 枚举区间内的所有数对(i, j)
    for (int i = l; i <= r; i++) {
        for (int j = i + 1; j <= r; j++) {
            // 更新答案为当前数对和2019的模的最小值
            ans = min(ans, ((i % 2019)  * (j % 2019)) % 2019);
        }
    }

    // 输出答案
    cout << ans << "\n";
}

PYTHON
# 读取区间的左右边界
l, r = map(int, input().split())

# 如果区间长度大于等于2019,那么一定可以找到两个数i和j,使得i*j mod 2019为0
if r - l >= 2019:
    print(0)
else:
    # 初始化答案为2018,因为i*j mod 2019的最大值不会超过2018
    ans = 2018

    # 枚举区间内的所有数对(i, j)
    for i in range(l, r+1):
        for j in range(i+1, r+1):
            # 更新答案为当前数对和2019的模的最小值
            ans = min(ans, (i*j) % 2019)
            if ans == 0:  # 如果ans已经为0,那么已经找到最小值,可以提前结束循环
                break
        if ans == 0:
            break

    # 输出答案
    print(ans)

JAVA
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 读取区间的左右边界
        int l = scanner.nextInt();
        int r = scanner.nextInt();

        // 如果区间长度大于等于2019,那么一定可以找到两个数i和j,使得i*j mod 2019为0
        if (r - l >= 2019) {
            System.out.println(0);
            return;
        }

        // 初始化答案为2018,因为i*j mod 2019的最大值不会超过2018
        int ans = 2018;

        // 枚举区间内的所有数对(i, j)
        for (int i = l; i <= r; i++) {
            for (int j = i + 1; j <= r; j++) {
                // 更新答案为当前数对和2019的模的最小值
                int aaa = i  % 2019;
                int bbb =  j  % 2019;
                ans = Math.min(ans, (aaa * bbb) % 2019);
                if (ans == 0) { // 如果ans已经为0,那么已经找到最小值,可以提前结束循环
                    System.out.println(ans);
                    return;
                }
            }
        }

        // 输出答案
        System.out.println(ans);
    }
}

L Ensemble’s heritage

题解

使用了差分数组的思想,通过对每个房间可以打开的卡片范围进行统计,然后通过遍历每张卡片,更新每张卡片可以打开的房间数量,最后统计出可以打开所有房间的卡片数量。

CODE

CPP
#include<bits/stdc++.h>
using namespace std;

int main() {
    int n, m;
    cin >> n >> m; // 读取卡片数量和房间数量

    vector<int> v(n + 10,0); // 初始化一个大小为n+10的向量,所有元素都为0

    for (int i = 0;i < m;i++) { // 对于每个房间
        int l, r;
        cin >> l >> r; // 读取可以打开这个房间的卡片范围
        v[l]++, v[r+1]--; // 对应的卡片数量加一,范围外的卡片数量减一
    }

    int ans = 0; // 初始化答案为0

    for (int i = 1;i <= n;i++) { // 对于每张卡片
        v[i] += v[i - 1]; // 更新当前卡片的数量
        if (v[i]==m) ans++; // 如果当前卡片的数量等于房间数量,说明这张卡片可以打开所有的房间,答案加一
    }

    cout << ans << "\n"; // 输出答案
    return 0;
}
PYTHON
from collections import defaultdict

def main():
    # 读取卡片数量和房间数量
    n, m = map(int, input().split())

    # 初始化一个字典,所有元素都为0
    v = defaultdict(int)

    for _ in range(m): # 对于每个房间
        # 读取可以打开这个房间的卡片范围
        l, r = map(int, input().split())
        # 对应的卡片数量加一,范围外的卡片数量减一
        v[l] += 1
        v[r+1] -= 1

    # 初始化答案为0
    ans = 0

    # 对于每张卡片
    for i in range(1, n+1):
        # 更新当前卡片的数量
        v[i] += v[i - 1]
        # 如果当前卡片的数量等于房间数量,说明这张卡片可以打开所有的房间,答案加一
        if v[i] == m:
            ans += 1

    # 输出答案
    print(ans)

if __name__ == "__main__":
    main()

JAVA
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 读取卡片数量和房间数量
        int n = scanner.nextInt();
        int m = scanner.nextInt();

        // 初始化一个大小为n+10的数组,所有元素都为0
        int[] v = new int[n + 10];

        for (int i = 0; i < m; i++) { // 对于每个房间
            // 读取可以打开这个房间的卡片范围
            int l = scanner.nextInt();
            int r = scanner.nextInt();
            // 对应的卡片数量加一,范围外的卡片数量减一
            v[l]++;
            v[r+1]--;
        }

        // 初始化答案为0
        int ans = 0;

        // 对于每张卡片
        for (int i = 1; i <= n; i++) {
            // 更新当前卡片的数量
            v[i] += v[i - 1];
            // 如果当前卡片的数量等于房间数量,说明这张卡片可以打开所有的房间,答案加一
            if (v[i] == m) {
                ans++;
            }
        }

        // 输出答案
        System.out.println(ans);
    }
}

标签:distance,进阶,int,题解,2024,加油站,ans,include,scanner
From: https://www.cnblogs.com/FanWQ/p/17983681

相关文章

  • 2024/1/23 算法笔记
    1.负进制数[P1017NOIP2000提高组]进制转换-洛谷|计算机科学教育新生态(luogu.com.cn)所谓负进制数,就是进制数为负数的一种实数表示法。例如,-15(十进制)相当于110001(-2进制),并且它可以被表示为2的幂级数的和数:110001=1(-2)5+1*(-2)4+0(-2)3+0*(-2)2+0(-2)^1+1(-2)......
  • 2024-01-23 闲话。
    总结一下最近想到的事情:闲话Novelty制胜。有乐子就能满足人们猎奇的需求,“山朗润起来了,水涨起来了,太阳的脸红起来了。”这种内容没有流量效应,受众太少production,平铺直叙感觉也没什么意思,最近在bilibili上看到一个叫做Zhao_Song的up主,满足了我对“我能解答的”谜语的......
  • 2024年是消费年,那保障和促进的措施就真的做到了吗?
    1、促消费,就要保护消费者吧。像那种宰客行为,要坚决打击吧。还是中国目前最大的消费问题,可是蛮触目惊心的。烂尾楼问题也没解决。有人说是企业行为,我觉得恰恰不是,预售制是谁制定的???预售制也没保护消费者呀。还有,国家就应该立刻马上立法,要么取消预售制,要么如果烂尾了,买房(消费者)就不......
  • Romberg 数值积分算法+P3779 题解(马上写完)
    Romberg算法吊打Simpson的且不玄学(没有什么十五倍)的数值积分算法。缺点是过程复杂一点,但是只体现在证明上,代码很短。铺垫算法梯形求积公式公式\[\int_a^bf(x)dx\approx\frac{(f(a)+f(b))(b-a)}2\\\text{令}(1)=\frac{(f(a)+f(b))(b-a)}2\]计算梯形求积公式的误差......
  • UofTCTF 2024 比赛记录
    这次的题目挺有意思,难度适中,*开头的代表未做出,简单记录一下解题笔记。IntroductionGeneralInformation题目TheflagformatforallchallengesisUofTCTF{...},caseinsensitive.Ifyouareexperiencingtechnicaldifficultieswithchallenges,supportisonour......
  • THUWC 2024 游记
    2024.1.16/Day-9期末考试考完啦!!!1晚上开写THUSC2023Day2!然而啥都没写出来,只过了comb_task1和comb_task4。2024.1.17/Day-8过了comb_task2和comb_task3和comb_task5,comb_task6\(40\)分写出了\(30\)分!晚上zgc教我怎样把二进制下的减法转化为加法。感觉......
  • 19_Java流程控制01-Scanner进阶使用
    Scanner进阶使用整数:hasNextInt()——nextInt()小数:hasNextFloat()——nextFloat()if:判断语句while:循环语句练习:循环输入,求和与平均数,回车确认,非数字结束指令并输出结果。Scannerscanner=newScanner(System.in);//开始doublesum=0;intm=0;System.out.println("请输......
  • 百度网盘(百度云)SVIP超级会员共享账号每日更新(2024.01.23)
    一、百度网盘SVIP超级会员共享账号可能很多人不懂这个共享账号是什么意思,小编在这里给大家做一下解答。我们多知道百度网盘很大的用处就是类似U盘,不同的人把文件上传到百度网盘,别人可以直接下载,避免了U盘的物理载体,直接在网上就实现文件传输。百度网盘SVIP会员可以让自己百度账......
  • 2024-1-23URL查询参数
    目录URL查询参数小结URL查询参数在axios中查询参数需要用到params选项注意:axios在运行时把参数名和值,会拼接到url?参数名=值格式axios({ url:'目标资源地址', paramas:{ 参数名:值 }}).then(result=>{ //对服务器返回的数据做后续处理})然后这里提供一个例子(用于......
  • 哈希学习笔记+杂题(进阶1 字符串哈希)
    哈希杂题前言:竟然下雪了,但是天是灰蒙蒙的。一、哈希学习笔记+杂题(进阶1字符串哈希)相关题单:戳我字符串哈希因为是一种玄学做法,所以具有极强的延展性。所以再碰到字符串的题时,抛开马拉车,kmp,字典树,AC自动机,SA&SAM,先想一下哈希的做法,如果时间复杂度允许,那就可以直接上哈希(虽然你......