题目链接
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; }