蓝书例题写题笔记(第一章 算法设计基础)

可是我为什么要专门开一发写这个呢......

1.1 思维的体操

例题1 The Dragon of Loowater

贪心

#include<cstdio>
#include<algorithm>
using namespace std;
int n,m;
int x[20005],y[20005];
int main()
{

    while(~scanf("%d %d",&n,&m)&&(n||m))
    {
        for(int i=0;i<n;i++) scanf("%d",&x[i]);
        for(int i=0;i<m;i++) scanf("%d",&y[i]);
        sort(x,x+n);
        sort(y,y+m);
        int k=0;
        int num=0;
        for(int i=0;i<m;i++)
        {
            if(x[k]<=y[i])
            {
                num+=y[i];
                k++;
                if(k==n) break;
            }
        }
        if(k<n) printf("Loowater is doomed!\n");
        else printf("%d\n",num);
    }
    return 0;
}

例题2 Commando War

贪心

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 100010
using namespace std;
int n,cnt;
struct Node{int a,b;}node[MAXN];
inline bool cmp(struct Node x,struct Node y){return x.b>y.b;}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        for(int i=1;i<=n;i++)
            scanf("%d%d",&node[i].a,&node[i].b);
        sort(&node[1],&node[n+1],cmp);
        long long ans=0,sum=0;
        for(int i=1;i<=n;i++)
        {
            sum+=node[i].a;
            ans=max(ans,sum+node[i].b);
        }
        cnt++;
        printf("Case %d: %lld\n",cnt,ans);
    }
    return 0;
}

例题3 Spreading the Wealth(中位数,贪心)

题目模型:给定数轴上的n个点,在数轴上的所有点中,中位数离所有的顶点距离之和最小。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 1000010
using namespace std;
int n;
long long a[MAXN],c[MAXN];
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
        long long tot=0;
        for(int i=1;i<=n;i++) tot+=a[i];
        long long M=tot/n;
        c[0]=0;
        for(int i=1;i<n;i++) c[i]=c[i-1]+a[i]-M;
        sort(&c[0],&c[n]);
        long long cur=c[n/2];
        long long ans=0;
        for(int i=0;i<n;i++) ans+=abs(cur-c[i]);
        printf("%lld\n",ans);
    }
    return 0;
}

例题4 Graveyard

例题5 Piotr's Ants

例题6 Image Is Everything

例题7 Even Parity

例题8 Colored Cubes

例题9 Chinese Mahjong

例题10 Help is needed for Dexter

给定正整数n,你的任务是用最少的操作次数把序列1,2,3...,n中的所有数都变成0,每次操作可以从序列中选择一个或者多个证书,同时减去一个相同的正整数。
f(n)=f(n/2)+1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define MAXN 100010
using namespace std;
int n;
inline int solve(int x)
{
    if(x==1) return 1;
    else return solve(x/2)+1;
}
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    while(scanf("%d",&n)!=EOF)
        printf("%d\n",solve(n));
    return 0;
}

例题11 A Different Task

例题12 Assemble

例题13 Pie

例题14 Fill the Square

例题15 Network

例题16 Beijing Guards

例题17 Age sort

桶排

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#define MAXN 110
using namespace std;
int n;
int cnt[MAXN];
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("ce.in","r",stdin);
    #endif
    while(scanf("%d",&n)!=EOF)
    {
        if(n==0) break;
        memset(cnt,0,sizeof(cnt));
        int cur;
        for(int i=1;i<=n;i++) scanf("%d",&cur),cnt[cur]++;
        bool flag=false;
        for(int i=1;i<=100;i++)
        {
            if(cnt[i]==0) continue;
            for(int j=1;j<=cnt[i];j++)
            {
                if(flag==true) printf(" ");
                printf("%d",i);
                flag=true;
            }
        }
        printf("\n");
    }
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/fengxunling/p/10681071.html