首页 > 代码库 > Codeforces 437B & 437C

Codeforces 437B & 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){    return aa.ln>bb.ln;}int can[100005];int main(){    int sum,limit,ok=0,s=0;    long long tot=0;    cin >> sum >> limit;    for(int i=0;i<limit;i++)    {        a[i].n=i+1;        a[i].ln=lowbit(i+1);    }    sort(a,a+limit,cmp);    for(int i=0;i<limit;i++)    {        if(tot+a[i].ln < sum)        {            can[i]=1;            tot+=a[i].ln;            s++;            continue;        }        if(tot+a[i].ln == sum)        {            can[i]=1;            tot+=a[i].ln;                        s++;            break;        }        if(tot>sum)        {            can[i]=0;            continue;        }    }    if(tot==sum)    ok=1;    if(ok)    {        cout << s << endl;        for(int i=0;i<limit;i++)        {            if(can[i])                cout << a[i].n << " ";        }        cout << endl;    }    else    {        cout << "-1" << endl;    }    return 0;} 

 

Codeforces 437C

题意:n个部分,m个连接线,拆某根线需要花费能量,为其两端连接部分的能量值中的较小值。求要把所有连接线拆掉所需最小花费。

无脑边读边加,线肯定是要全拆掉的,读一个累加一次最后输出即可。

#include<iostream>#include<algorithm>using namespace std;int a[1005];int main(){    int n,m;    long long ans=0;    cin >> n >> m;    for(int i=1;i<=n;i++)    {        cin >>a[i];    }    for(int i=1;i<=m;i++)    {        int x,y;        cin >> x >> y;        ans+=min(a[x],a[y]);    }    cout << ans <<endl;    return 0;} 

 

Codeforces 437B & 437C