P7760 [COCI2016-2017#5] Tuna 题解

· · 题解

这是本蒟蒻第十一次写的题解,如有错误点请好心指出!

问题简述

这道题我们可以换另一种思路去看待它,就容易理解了:

N 个数和一个数 X,每个数附有三种值分别为 P_1,P_2,P_3,若 |P_1-P_2| 大于 X,则取 P_3 为值,否则取 P_1P_2 之间的最大值,求这 N 个数的值的和。

解法综述

根据问题简述模拟即可。对 N 个数的取值进行操作,读入两个数 P_1P_2,若发现 P_1P_2 之间的差不大于 X,则用 ans 累加它们之间的最大值,否则读入一个数 P_3 并用 ans 累加这个数,最后输出 ans 即可。

代码描述

#include<cstdio>
#define max(a,b) (a>b?a:b)//取两个数之间最大值
#define abs(a,b) (a>b?a-b:b-a)//取两个数之间的绝对值
int N,X,P1,P2,P3,ans;
int main()
{
    scanf("%d%d",&N,&X);
    while(N--)//对N个数的取值进行操作
    {
        scanf("%d%d",&P1,&P2);//读入两个数P1和P2
        if(abs(P1,P2)<=X) ans+=max(P1,P2);//若发现P1与P2之间的差不大于X,则用ans累加它们之间的最大值
        else//否则
        {
            scanf("%d",&P3);//读入一个数P3
            ans+=P3;//用ans累加这个数
        }
    }
    printf("%d",ans);//最后输出ans即可
    return 0;
}