Codeforces Round #563 (Div. 2) 题解

A题:

题意

给你一个长度为 2n的序列,重排该序列使得前一半和不等于后一半和。无解输出 1 。

题解

只有一种情况是无解,即序列所有数字相同,否则其他情况都是有解的,随意输出的话,排序就ok,必定会前一半不等于后一半。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int main()
 5 {
 6     int n;
 7     scanf("%d",&n);
 8     int a[2010];
 9     for(int i=0;i<2*n;i++)
10     scanf("%d",&a[i]);
11     sort(a,a+2*n);
12     if(a[0]==a[2*n-1])
13     printf("-1\n");
14     else
15     {
16         for(int i=0;i<2*n;i++)
17         {
18             if(i!=2*n-1)
19             printf("%d ",a[i]);
20             else
21             printf("%d\n",a[i]);
22         }
23     }
24     return 0;
25  } 
View Code

 

B题:

题意

给你一个长度为 n 的序列 a1,,an若 ai+aj为奇数你可以交换这两个数。求你能得到的字典序最小的序列。n10^5。

题解

显然如果所有数都是奇数或偶数答案则为原数列。否则,由于对于两个奇偶性相同的数我们可以藉由一个奇偶性不同的点交换,所以答案输出为排序后的序列。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int a[100010];
 5 int main()
 6 {
 7     int n,t;
 8     scanf("%d",&n);
 9     int sum1=0,sum2=0;
10     for(int i=0;i<n;i++){
11         scanf("%d",&a[i]);
12         if(a[i]%2==0)
13         sum1++;
14         else
15         sum2++;
16     }
17     if(sum1==0||sum2==0)  ;
18     else  sort(a,a+n);
19 
20     for(int i=0;i<n;i++){
21         if(i!=n-1)
22         printf("%d ",a[i]);
23         else
24         printf("%d\n",a[i]);
25     }
26     return 0;
27  } 
View Code

 

C题:

题意

构造一个长度为 n-1 的序列a2,a3,a4...an,使得任意下标互质的两个位置的数不等且最大值尽可能小。n10^5

题解

采用筛法思想

我们用n=15举例:

下标:  2,3,4,5,  6,  7, 8,  9, 10,11, 12, 13, 14, 15

a[i]值: 1    2   1   3    1    4    1    2   1       5     1       6       1        2

我们从下标为2看,把2的倍数标记一下,这样的话下标为2,4,6,8,10,12,14都将被标记,这些数都不是互质的,那么这些数可以相等,既然值要最小,那就定为1

然后看下标为3,把3的倍数标记一下,这样的话下标为3,9,15都将被标记,这些数都不是互质的,那么这些数可以相等,因为下标互质的两个数值不能相等,那又因为这些数是存在与二的倍数互质,就定为2

类推。。。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 int main()
 5 {
 6     int n;
 7     scanf("%d",&n);
 8     int x=0;
 9     int p[100010];
10     for(int i=0;i<=n;i++)
11     p[i]=0;
12     for(int i=2;i<=n;i++)
13     {
14         if(p[i]!=0)
15         continue;
16         p[i]=++x;
17         int j=i*2;
18         while(j<=n)
19         {
20             if(p[j]==0)
21             p[j]=x;
22             j+=i;
23         }
24     }
25     for(int i=2;i<=n;i++)
26     cout<<p[i]<<" ";
27     cout<<endl;
28  } 
View Code

 

错误点

1.x++与++x的使用问题错误:

x++数据:  错误

15
1 2 2 3 2 4 2 3 2 5 2 6 2 3

++x数据: 正确

15
1 2 1 3 1 4 1 2 1 5 1 6 1 2

分析:p[i]=x++,在这一步x是自加的,但p[i]的值是没有加p[i]自加的1,而后面的数据a[i]=x,这里的x是已经自加过的x,所以数据不同。

 

D题:

题意

给你 n,x,构造一个尽可能长的每个数 2n的序列使得不存在子段的异或和为 0或 x 。1n18,1x<218

题解

 

转载于:https://www.cnblogs.com/Aiahtwo/p/10975138.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值