题目描述
每个人的一生只能认真对待一件事。
给定一个整数 n,表示人生中遇到的 n 件事。若认真对待某件事,可以获得的分数分别为 a1,a2,…,an,若是只是被动应付,则获得的分数分别为 b1,b2,…,bn。
请选择应该认真对待哪一件事,才能让分数的总和达到最大。
输入格式
第一行:单个整数表示 n
第二行到第 n+1 行:每行两个整数表示 ai与bi
输出格式
单个整数:表示最大的分数之和
数据范围
对于 30% 的数据,1≤n≤5,000;
对于 60% 的数据,1≤n≤20,000;
对于 100% 的数据,1≤n≤500,000;
0≤bi≤ai≤4000;
样例数据
输入:
3
1 1
2 0
3 2
输出:
5
【题解】
做好第i件事比没做好这件事可以多赚多少分的最大值,然后加上做不好每一件事的得分。
#include<bits/stdc++.h>
#include <iostream> // cin cout的头文件 基本输入流
#include <iomanip> //cout输出时,保留小数fixed、setprecision的头文件 参数化输入/输出
#include <cstdio> //scanf、printf的头文件 定义输入/输出函数
#include <cmath> //sqrt()求平方根、定义数学函数
#include <algorithm> //STL通用算法
#include <cstring>
#include <string>
using namespace std;
const int N=5e5+5;
int a[N],b[N];
int main(){
int n,mx=-9999;
long long ans=0;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i];
ans+=b[i];
}
for(int i=1;i<=n;i++){
mx=max(mx,a[i]-b[i]);
}
ans+=mx;
cout<<ans<<endl;
return 0;
}
评论区