codeforces D. Toy Sum 解题报告

本文详细介绍了如何通过巧妙的算法解决Codeforces竞赛题405D,该题要求从1到1000000中选择n个数,计算特定的和,并找到与之相等的另一个和。文章提供了代码实现,帮助读者理解并应用算法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://codeforces.com/problemset/problem/405/D

题目意思:从 1 ~ 1000000 中选择 n 个数:x1,x2,...,xn,对 x1-1,x2-1,...xn-1 求和得s1。然后在 1 ~ 1000000 中除已经选择过的n个数中选择一些数,假设为y1, y2,...ym,设s = 1000000,对s-y1,s-y2,...,s-ym求和,如果这个和与s1相等,则输出y1,y2,...,ym

     可以这样想,由于集合X中:x1,x2,...,xn 是各不相同的,那么在S - X,设为Y(假定S是全集:1,2,...,n)对每个数xi(i : 1 ~ n)一定有相应的s-i+1与之对应(前提是,如果S-xi不在集合X中);如果有相应的s-xi+1在X中,那么可以找没有选择过的yj,s-yj+1来替换xi, s-xi+1。例如X中有 100, 999901而没有99, 999902,那么可以选择99, 999902来替代。效果是相同的。这样Y中的数量跟n是相同的。

     

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 const int maxn = 1e6;
 8 int x[maxn];
 9 
10 int main()
11 {
12     int n, i, j, t;
13     while (scanf("%d", &n) != EOF)
14     {
15         memset(x, 0, sizeof(x));
16         for (i = 0; i < n; i++)
17         {
18             scanf("%d", &t);
19             x[t] = 1;
20         }
21         printf("%d\n", n);
22         int cnt = 0;
23         for (i = 1; i <= maxn; i++)
24         {
25             if (x[i] && !x[maxn-i+1])
26             {
27                  printf("%d ", maxn-i+1);
28                  cnt++;
29             }
30         }
31         for (i = 1; i <= maxn && cnt != n; i++)
32         {
33             if (!x[i] && !x[maxn-i+1])
34             {
35                 printf("%d %d ", i, maxn-i+1);
36                 cnt += 2;
37             }
38         }
39         printf("\n");
40     }
41     return 0;
42 }

 

     

 

转载于:https://www.cnblogs.com/windysai/p/3619222.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值