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;
}题目
第一题
第二题
查看22道真题和解析