目录
题目链接
D - 先来签个到(真心换真心)
皮卡丘与 Codeforces - Gym 103478A - Virtual Judge (csgrandeur.cn)
一些话
比赛时觉得很怪的一道题,为什么觉得很怪呢?因为我是傻逼。
wa5发纯纯的做题习惯与思维方式有问题
1.是比赛时在纠结分数小于0的能不能参加比赛,
2.是分数可不可以小于0还是到了0再扣分还是0
关于1,题目分数范围是-1e4~+1e4,全给负分账号是合法的,如果全给负分的话,怎么参加比赛?
关于2,还是题目分数范围的问题,初始分数都可小于0了,还在纠结分数可不可以小于0?还纠结扣到0再扣分的结果?
因为纠结这些东西,所以在关键的wa1后,又往上面纠结的情况做了尝试,然后出现4wa
至于最关键的1wa,是由于没有注意题目的边界数据引发的特殊情况,因为太久没遇到此类边界特殊情况的题,所以一直忽略了这个步骤,经过这次罚时应该得到教训,不要因为贪快而忽略解题步骤。
流程
题目要账号中的最大分数账号的分数最大,所以理所当然会想到能加分的比赛就用它来打,不能加分的比赛就用别的号。先找出最大分值,再将读到的正值加到最大分值中最后再输出即可,但这只是一般情况。
通过观察题目给的账号数目的数据范围可以发现,账号数是可以为1的,此时无论比赛加分还是扣分,你都只能拿同一个账号来打,所以流程就变为将读到的值加入账号分值中最后再输出
套路
必要做题步骤,无条件
考虑完一般情况后,观察题目边界值是否会导致题目出现特殊情况
ac代码
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 1e5 + 10;
ll f[N];
int main(){
ll n,m;
cin >>n >>m;
for(int i = 1;i <= n;i++){
scanf("%lld",&f[i]);
}
sort(f+1,f+n+1);
if(n > 1){
while(m--){
ll x;
scanf("%lld",&x);
if(x > 0) {
f[n] += x;
}
}
}
else if(n == 1){
while(m--){
ll x;
scanf("%lld",&x);
f[n] += x;
}
}
cout << f[n] << endl;
return 0;
}