第二届太原理工大学程序设计新生赛决赛-(Fuse the Cube Fragment-J题)思维推理

在解密完那条古怪的序列后的不久,Vanis收到了一个奇怪的包裹,寄件人地址竟然写着火星 ()。包裹里有一堆蕴含着能量的小晶块 (Cube Fragment),经过一些实验,Vanis发现这些小晶块具有如下性质:

  1. 有n种不同的小晶块,编号1至n,每种晶块都蕴含1个单位的能量。
  2. 两种晶块(第i种和第j种)能够稳定融合,当且仅当i \nmid ji∤j且j \nmid ij∤i,其中\nmid∤表示不能整除。

Vanis想知道如果每种小晶块只使用一个,能够融合成的稳定的大晶体最大能蕴含多少个单位的能量,他想请你给出两种不同的融合方案。

两种融合方案是不同的,当且仅当至少存在一种晶块出现在一种方案中而不出现在另一种方案中。

输入描述:
输入一行一个整数n,表示小晶块的种类数。

数据规范:

  • 5 \le n \le 3 \times 10^45≤n≤3×10
    4
    .
    输出描述:
    输出两行,表示两种不同的融合方案,每行输出一种,使用编号表示使用哪种小晶块,每行输出内的编号之间使用一个空格符分隔。

注意:

  1. 融合顺序无关,即\texttt{“3 2 5”}"3 2 5"与\texttt{“3 5 2”}"3 5 2"被认为是同一种融合方案。
  2. 满足条件的融合方案可能不止有两种,任意合理的两种融合方案都会被认为是正确的。
    示例1
    输入
    复制
    5
    输出
    复制
    3 2 5
    3 4 5
    示例2
    输入
    复制
    7
    输出
    复制
    2 3 5 7
    4 6 5 7
    题意:有1-n个晶体,选择晶体,要求他们之间i不能整除j,j不能整除i,找出两个最大能量的组合,至少有1个数字只能出现一次。
    思路:这题刚开始的时候,开始说是素数,一直wa,最后发现这题并不是素数。多举几个例子来推出应该是:
    第一个串为后半部分,第二个串为第一个串的个数在做一些调整。因为一半得分一下奇偶。后来想了一下原因为什么是一半,因为不整除又要求最大,那从最后一位看来,整除只能是/2了,所以后一半肯定是最大的。
    1.若n为奇数:
    第一个串为后半部分,个数为(n/2)+1,第二个串因为值最大,只能用(n-1)/2来替换(n-1),来保持最大且满足不整除的要求。
    2.若n为偶数:
    第一个串为(n/2)+1个从后面开始,第二个串,我刚开始按照奇数串那样推,但wa了,所以可以抛下最后一位,往前来找(n/2)个数字,所以就是找(n/2)~n-1。
    代码:
#include<bits/stdc++.h>
using namespace std;
int main ()
{
    ios::sync_with_stdio(false);
    int n;
    cin>>n;
    if(n%2!=0){//奇数
        int t=(n/2)+1;
        for(int i=t;i<=n;i++){//第一个
            if(i!=n)
                printf("%d ",i);
            else
                printf("%d\n",i);
        }
        int tt=(n-1)/2;
        printf("%d ",n);
        for(int i=tt;i<=n-2;i++){//第二个
            if(i!=n-2)
                printf("%d ",i);
            else
                printf("%d\n",i);
        }
    }
    else{//偶数
        int t=(n/2)+1;
        for(int i=t;i<=n;i++){//第一个
            if(i!=n)
                printf("%d ",i);
            else
                printf("%d\n",i);
        }
        int tt=n/2;
        for(int i=tt;i<=n-1;i++){//第二个
            if(i!=n-1)
                printf("%d ",i);
            else
                printf("%d\n",i);
        }
    }
    return 0;
}
/*
1-n
i不能整除j,j不能整除i
最大的能量
至少存在一种晶体只出现了一次
n=5
1 2 3 4 5
    3 4 5     (n/2)+1
  2 3   5
n=6
1 2 3 4 5 6
      4 5 6
  2     5 6   
    3 4 5    (n/2)~n-1
n=7
1 2 3 4 5 6 7
      4 5 6 7
    3 4 5   7   抛弃一位,往前倒n/2位
n=8
1 2 3 4 5 6 7 8
        5 6 7 8
      4 5 6 7

*/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值