8.7 疯狂游戏

先上代码

第一题 大数取余

#include <iostream>
using namespace std;
long long strToInt(string str){
    long long res = 0;
    for(auto &it:str)
        res = res * 10 + it-'0';
    return res;
}
int main(){
    string m;
    long long n;
    cin >> m >> n;
    // Long long 最多支持 19位数, 就按照正常取余的过程,一步一步来即可
    while(m.size() > 18){
        string tem = m.substr(0,18);
        long long num = strToInt(tem);
        long long re = num % n;
        m = to_string(re) + m.substr(18);
    }
    cout << strToInt(m) % n << endl;
}

这个题适合用 JAVA 来写,直接调用 APT

import java.math.BigInteger;
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        BigInteger m = scanner.nextBigInteger();
        BigInteger n = scanner.nextBigInteger();
        BigInteger z = m.mod(n);
        System.out.println(z);
    }
}

第二题 小鹅冲冲冲

把经过的补给站都放到一个优先级队列里,每次补给
题目里的补给站的距离是距离终点的距离,这一块儿一定要看清

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
int main(){
    int n, M, E;
    cin >> n >> M >> E;
    priority_queue<int> que;
    vector<pair<int,int>> arr(n);
    for(int i=0; i<n; i++)
        cin >> arr[i].first >> arr[i].second;
    sort(arr.begin(), arr.end());
    // ind 表示走到第几个补给站了   cur  表示离终点的距离,为 0 时,到达终点, res 记录去了几次补给站
    int ind = arr.size()-1, cur = M-E, res = 0;

    // 先把第一次能经过的补给站入堆
    while(ind >=0 && arr[ind].first >= cur)
        que.push(arr[ind--].second);

    // 进入补给站
    while(!que.empty() && cur > 0){
        res++;
        cur -= que.top();
        que.pop();

        // 遍历可能经过的补给站
        while(ind >=0 && arr[ind].first >= cur)
            que.push(arr[ind--].second);
    }
    if(cur > 0) cout << "-1" << endl;
    else cout << res << endl;

    return 0;
}

题目

第一题

图片说明

第二题

图片说明

图片说明

全部评论

相关推荐

03-28 19:11
铜陵学院 C++
有礼貌的山羊追赶太阳:太典了,连笔试都没有开始就因为HC满了而结束了,而且还卡你不让你再投其他部门的。
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务