牛客月赛46部分题

学习笔记,仅供参考,希望各位大佬纠错。

链接1:

https://ac.nowcoder.com/acm/contest/11223/A

题意1:

两人玩游戏,获胜概率均为 1/2,求其中一人赢几次概率最大,结果若有多个,则从小到大输出。

代码1:

#include 
using namespace std;
int main()
{
    int n;
    cin >> n;
    if(n % 2 == 0)
        cout << n / 2;
    else
        cout << n/2 << ' ' << n/2+1;
    return 0;
}

解释1:

牛客月赛46部分题_第1张图片

由高中数学二项分布知识可得:当 n 为奇数时,x = n / 2 或 x = n / 2 + 1 可使得赢的概率最大;当 n 为偶数时,x = n / 2 可使得赢的概率最大。

总结1:

        学算法还得把数学学好,所以大学的有关数学的课要认真听,学好数学的结果,不只是知道了很多知识,更重要的是数学思维,思考问题的方式。

链接2:

https://ac.nowcoder.com/acm/contest/11223/B

题意2:

对已有的一个序列进行排序,问有没有可能使得所有长度小于等于 2 的子区间和不等于 0。

代码2:

#include 
#include 
#include 
using namespace std;
int main()
{
    int n;
    cin >> n;
    vectorv(n,0);
    for(int i = 0;i < n;i ++)
    {
        cin >> v[i];
        if(v[i] == 0)
        {
            printf("NO\n");
            return 0;
        }
    }
    sort(v.begin(),v.end());
    v.erase(unique(v.begin(),v.end()),v.end());
    if(v.size()==2 && v[0]+v[1]==0) 
		printf("NO\n");
    else	printf("YES\n");
}

解释2:

vector:即向量,是一个封装了动态大小数组的顺序容器,能从够存放各种类型的对象。

vector<类型>标识符
vector<类型>标识符(最大容量)
vector<类型>标识符(最大容量,初始所有值)

unique:属于 STL 中比较常用函数,功能是元素去重,即 " 删除 " (是指重复元素的位置被不重复的元素给占领了)序列中所有相邻的重复元素(只保留一个)。 

unique(v.begin(),v.end())

表示对容器中 [ v.begin () ,v.end () ] 范围的元素进行去重,返回值是一个迭代器,指向去重后容器中不重复序列的最后一个元素的下一个元素。

unique 函数常与 erase 函数一起用,来达到删除重复元素的目的。

end_unique = unique(result.begin(),result.end());
result.erase(end_unique,result.end());

 end_unique 返回去重后最后一个元素的位置,而重复的元素都被移动到后面去了,所以要将从去重后最后一个元素的地址到原数组最后一个地址这些地址中的元素都去掉,从而得到无重复元素的数组。

牛客月赛46部分题_第2张图片 

在一个函数里面,有且只能有一个 return 语句,当程序执行到 return 语句时,将不在执行函数体中语句,即函数结束了。在 main 函数中,我们一般都把 return 语句放在末尾,但在该代码中 return 语句在中间,当语句进入到 if 语句中,输出后程序就结束了,不会再继续后面的语句。切记:此处的 return 语句不能改成 break 语句。 

 总结2:

        我参考过一个通过了的代码,当输入 -2 1 2 数据时,输出的是 NO,按题意应该输出 YES,但是这个代码过了。当时因为从未见到过这种情况,一直想不明白,后面也是问大佬后才知道,有些题数据测试用例给少了。由此可得有些题数据有漏洞,这下又长知识了。

 

你可能感兴趣的:(算法,c++)