NOIP2018普及组第二题《龙虎斗》再思考

写在前面:这道题是在NOIP2018考完后很久写的,是关于《龙虎斗》这道题目一些新的感想。

试题:龙虎斗
题目描述(大意):一条线段,共有n个点,m点左边是A的势力,右边是B的势力,你需要给任意位置加势力,在哪里加两边势力最接近。

解题思路:这道题并不是很难 (那我也只拿了80分,坑) ,主要思路就是模拟,首先读入数据,计算两边的气势分别是多少,不过计不计算天降神兵就是你的事了,这个问题不大。下面就是进行一下判断,看看两边气势是否相等,相等就不用说了,放在中间(m)上,但是如果两边气势不相等的话,就要再次进行一个判断,是放在m上好还是放在另一侧,如果左边<右边,则放在左,如果右边>左边,则放在右。

下面放上代码:
//这是考场上写的,只有八十分
//有网站作证

#include
using namespace std;

long long a[100000+10]={0};

int main()
{
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    long long m,p1,s1,s2;
    cin>>m>>p1>>s1>>s2;
    
    /*int f=1;
    if(n==99999)
    {
        for(int i=1;i<=n;i++)
        {
            if(a[i]!=1000000000)
            {
                f=0;
                break;
            }
        }
        if(f==1)
        {
            cout<<"57271"<m)
    {
        qs2=qs2+(p1-m)*s1;
    }
    else if(p1==m)
    {
        qs3=0;
    }
    
    int x=0;
    if(qs2>qs)
    {
        int ans=0;
        x=qs2-qs;
        int min=999999;
        for(long long i=1;i<=m;i++)
        {
            int y=(m-i)*s2;
            if(abs(x-y)

满分程序:

#include 
#define max maxx 
#define min minn
#define ll long long
using namespace std;
ll n,c[100005],m,p1,s1,s2,p2;
ll lo,hu;
ll max(ll a,ll b)
{
    if(a>b) return a;
    else return b;
}
ll min(ll a,ll b)
{
    if(a>n;
    for(i=1;i<=n;i++) 
        cin>>c[i];
    cin>>m>>p1>>s1>>s2;
    c[p1]+=s1;
    for(i=1;i1 && (abs(lo+s2*(m-p2+1)-hu)

下面来谈一谈我写这篇文章的真实目的(就是关于极限数据的那些事儿):
这道题我不知道有没有人没看数据范围写了个int上去的,但是我身边有一个把define写错了

正确的写法:define long long int  //就是把程序里所有的int全部替换成long long
但是我这位同学写成了:define int long long //就是很光荣的写成了吧long long全部替换成int

这个比较尴尬,所以define和tydef这种玩意还是少用为妙,那天写错了就咕咕了。

下面是第二个问题:关于本体的极限数据。
NOIP2018普及组第二题《龙虎斗》再思考_第1张图片
仔细看一下,会发现这道题的极限数据挺坑爹,在后面的计算中,数值最大会达到10×1019,这个就非常的不好玩了,有不少我的同学, 实力非常强,但是没有对第二题进行极限数据处理,min的初始值设定成了10×1018,然后就一脸懵逼的撞进了陷阱,只拿了80分,所以总体来说,这道题难度不算大,只是出题人比较阴险的利用了大家的习惯(min初始值一般是10×1018)以及对第二题的一个基本的轻视,所以不少大佬跌进了坑里,这是一个比较值得大家注意的事情,做题看数据范围很重要!!!

你可能感兴趣的:(CCF(NOIP)考试分析)