算法第一次作业-Problem B. 课堂作业-7-4

题目描述

对于一个长为n的数组A0,A1,A2…An-1,定义这个数组的得分为(A0 xor A1)+(A1 xor A2)+(A2 xor A3)+…+(An-2 xor An-1) ,即相邻两项的异或值的加和,比如数组1 1 2 2的得分为(1 xor 1) + (1 xor 2) + (2 xor 2) = 0+3+0 = 3
现在你可以重新排列这个数组,问最大得分是多少
在这里插入图片描述当我们尝试着做这个题的时候,会发现比较难于实现的部分是输入多个数值后找全排列比较难。
但我们就像样例说明中的,用C++的一个函数。(本人喜欢C语言,但看到了说明,还是决定试一下c++,即使没学过c++,只要学过C,大抵意思都是能明白的~不要害怕!)
首先解释一些函数next_permutation(a,a+n)

next_permutation 产生全排列是非常的强大
函数原型:
bool next_permutation(iterator start,iterator end)
next_permutation(num,num+n)函数是对数组num中的前n个元素进行全排列,同时并改变num数组的值。

需要强调的是,next_permutation()在使用前需要要对排列数组按升序排序,否则只能找出该序列之后的全排列数。
即,需要按从小到大的顺序排好序之后的数组使用此函数才可以输出全部的全排列。

下面先举个栗子,方便不熟悉C++的朋友们了解一下

#include <iostream>
#include <algorithm>  //引用函数库
using namespace std;  //使用命名空间,即可以使用 输入函数cin 输出函数cout 
int main(void)
{
    int num[3]={1,2,3};
    do
    {
        cout<<num[0]<<" "<<num[1]<<" "<<num[2]<<endl;  //cout为输出,<< 只是c++的一个操作符  endl旨在输出后换行
    }while(next_permutation(num,num+3));  

    return 0;
}

结果是:
在这里插入图片描述
本题正确解析:

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int num;
    cin>>num;  //输入变量num的值
    long int a[num];
    int i;
    for(i=0;i<num;i++)
    {
        cin>>a[i];  //输入输入中每个元素的值
    }

    //sort
    sort(a,a+num);  //引用c++的排序函数,因为next_permutation(a,a+n)需要升序排序,而调用sort函数后会默认升序排序

    long int sum;
    long int max = 0;
    do
    {
        sum=0;  //需要每次清空sum的值
        for(i=0;i<num-1;i++)  //到num-1的目的请自己试数~(提示:请看for内部的算法)
        {
            sum = sum + (a[i]^a[i+1]);  // ^  异或运算符
        }
        if(sum > max)
        {
            max = sum;
        }
    }while(next_permutation(a,a+num));

    cout<<max;  //输出异或最大值
    return 0;
}

说明:异或这方面不用想太多,计算机自己会运算。只需要了解哪个是异或运算符就ok。
关于定义变量中的long int :之前用int试了很多次一直wrong answer ,改为long int 一遍过。应该是后续数据太多的时候int容不下了。这种AC题,请大家一定要有信心!不是思想的错,不是程序的错,就看看输入输出格式,再看看定义变量的数据类型!
还是要说明一点,如果自己不会算法题,觉得自己很菜,那就先读懂别人的程序,再自己敲。大家刚开始时谁都很菜。主要看坚持和稍微正确一些的方法!

以下高能!!!
怎么读懂一个程序?(或看一个算法的步骤)
1、看懂流程控制
2、看懂每个语句的功能
3、试数

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值