Codeforces 437B The Child and Set (贡献+贪心)

链接:https://codeforces.com/contest/437/problem/B

题意:给出n,sum,构造一个序列满足:整数,无重复,范围1-n,sigma(ai)=sum,输出长度和各个元素。n<1e5

题解:考虑1-n的每个整数对sum的贡献,在从大往下取(贪心)。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define lowbit(x) ((x)&-(x))

const int maxn=1e5+5;
int sum, n;
vector<int> ans, lbt[maxn];

int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    cin>>sum>>n;
    int tmax=-1;
    for(int i=1; i<=n; i++)
    {
        lbt[lowbit(i)].push_back(i);
        tmax=max(tmax, lowbit(i));
    }
    for(int i=tmax; i>=1; i--)
    {
        for(auto v:lbt[i]){
            if(sum>=i){
                sum-=i; ans.push_back(v);
            }
            else break;
        }
        if(sum==0) break;
    }
    if(sum){cout<<"-1"; return 0;}
    cout<<ans.size()<<"\n";
    for(auto v:ans)
        cout<<v<<" ";
    return 0;
}

原文地址:https://www.cnblogs.com/Yokel062/p/11768710.html

时间: 2024-11-02 01:02:18

Codeforces 437B The Child and Set (贡献+贪心)的相关文章

CodeForces 437B The Child and Set

Description CodeForces 437B 描述 从 $1\sim limit$ 中选取若干个互不相同的数字,使得这些数字的 $lowbit$ 和等于 $sum$,$1\leq sum, limit\leq 10^5$ . 输入 两个数 $sum, limit(1\leq sum,limit\leq 10^5)$. 输出 第一行输出 $n$ 表示所选数字的数目,然后第二行 $n$ 个数,表示所选数字. 如果无解输出$-1$. 样例 输入1 5 5 输出1 24 5 输入2 4 3 输

Codeforces 437C The Child and Toy(贪心)

题目连接:Codeforces 437C The Child and Toy 题目大意:孩子有一个玩具,有n个部件组成,m条绳子组成,每条绳子连接两个部件.小孩比较顽皮,要将玩具拆成不可分割的部件,每次剪断一条绳子的代价是该绳子连接的两个部件的权值中较小的值.问说最小的总代价是多少. 解题思路:以为每条边都是要被剪断的,所以将节点按照代价值从大到小排序,每次拿掉权值大的点,与该点连接并且还未剪断的边均用另外点的权值. #include <cstdio> #include <cstring

Codeforces 437D The Child and Zoo(贪心+并查集)

题目链接:Codeforces 437D The Child and Zoo 题目大意:小孩子去参观动物园,动物园分很多个区,每个区有若干种动物,拥有的动物种数作为该区的权值.然后有m条路,每条路的权值为该条路连接的两个区中权值较小的一个.如果两个区没有直接连接,那么f值即为从一个区走到另一个区中所经过的路中权值最小的值做为权值.问,平均两个区之间移动的权值为多少. 解题思路:并查集+贪心.将所有的边按照权值排序,从最大的开始连接,每次连接时计算的次数为连接两块的节点数的积(乘法原理). #in

Codeforces 437E The Child and Polygon(区间DP)

题目链接:Codeforces 437E The Child and Polygon 题目大意:给出一个多边形,问说有多少种分割方法,将多边形分割为多个三角形. 解题思路:首先要理解向量叉积的性质,一开始将给出的点转换成顺时针,然后用区间dp计算.dp[i][j]表示从点i到点j可以有dp[i][j]种切割方法.然后点i和点j是否可以做为切割线,要经过判断,即在i和j中选择的话点k的话,点k要在i,j的逆时针方. #include <cstdio> #include <cstring&g

Codeforces 437B &amp; 437C

Codeforces 437B 题意:在1到limit之间找最少个数,使得他们的lowbit总和等于sum. 先求出全部的lowbit()进行排序,然后扫一遍即可. #include<iostream> #include<algorithm> using namespace std; struct node{ int n,ln; }a[100005]; int lowbit(int x) { return x&(-x); } bool cmp(node aa,node bb

Codeforces --- 982C Cut &#39;em all! DFS加贪心

题目链接: https://cn.vjudge.net/problem/1576783/origin 输入输出: ExamplesinputCopy42 44 13 1outputCopy1inputCopy31 21 3outputCopy-1inputCopy107 18 48 104 76 59 33 52 102 5outputCopy4inputCopy21 2outputCopy0NoteIn the first example you can remove the edge bet

codeforces Gym 100187F F - Doomsday 区间覆盖贪心

F. Doomsday Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/problem/F Description Doomsday comes in t units of time. In anticipation of such a significant event n people prepared m vaults in which, as they think, it will

CodeForces 462B Appleman and Card Game(贪心)

题目链接:http://codeforces.com/problemset/problem/462/B Appleman has n cards. Each card has an uppercase letter written on it. Toastman must choose k cards from Appleman's cards. Then Appleman should give Toastman some coins depending on the chosen cards

【算法系列学习】codeforces D. Mike and distribution 二维贪心

http://codeforces.com/contest/798/problem/D http://blog.csdn.net/yasola/article/details/70477816 对于二维的贪心我们可以先让它变成其中一维有序,这样只需要重点考虑另一维,就会简单很多. 首先,对于题目要求的选择元素之和两倍大与所有元素之和,我们可以转化为选择元素之和大于剩下的.然后我们可以将下标按照a从大到小排序.然后选择第一个,之后每两个一组,选择b大的一个,如果n是偶数再选择最后一个. 至于这样写