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;
} 

 

posted @ 2016-09-04 15:19  Piddnad  阅读(264)  评论(0编辑  收藏  举报