zoukankan      html  css  js  c++  java
  • tai贪心^^(1)

    1.

    试设计一个用回溯法搜索子集空间树的函数。该函数的参数包括结点可行性判定函数和上界函数等必要的函数,并将此函数用于解0-1背包问题。 0-1 背包问题描述如下:给定n 种物品和一个背包。物品i 的重量是wi ,其价值为vi ,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品i只有2 种选择,即装入背包或不装入背包。不能将物品i 装入背包多次,也不能只装入部分的物品i。

    Input
    第一行有2个正整数n和c。n是物品数,c是背包的容量。接下来的1 行中有n个正整数,表示物品的价值。第3 行中有n个正整数,表示物品的重量。 
    Output
    将计算出的装入背包物品的最大价值和最优装入方案输出。第一行输出为Optimal value is
    Sample Input

    5 10
    6 3 5 4 6
    2 2 6 5 4


    Sample Output
    Optimal value is

    15
    1 1 0 0 1
    
    #include <stdio.h>
    struct BAG{
       int a;
       int b;
       double c;
    };
    int main()
    {
        int n,m,i,j,k,sum=0,h=0,y[11]={0};
        float x[11],p;
        struct BAG bag[11],t;
        scanf("%d%d",&n,&m);
        for(i=0;i<n;i++)
            scanf("%d",&bag[i].a);
        for(i=0;i<n;i++)
        {
            scanf("%d",&bag[i].b);
            x[i]=(float)bag[i].a/bag[i].b;
            bag[i].c=(float)bag[i].a/bag[i].b;
        }
        for(i=0;i<=n-2;i++)
        {
            k=i;
            for(j=i+1;j<=n-1;j++)
                if(bag[j].c>bag[k].c)
                   k=j;
            t=bag[i];bag[i]=bag[k];bag[k]=t;
        }
        for(i=0;i<n;i++)
        {
            if(m>=bag[i].b)
            {
                sum+=bag[i].a;
                m-=bag[i].b;
                h++;
            }
            else
            {
                p=bag[i].c;
                break;
            }
        }
        printf("Optimal value is
    ");
        printf("%d
    ",sum);
        j=0;
        for(i=0;i<n;i++)
        {
            if(p<x[i]&&j<=h)
            {
                j++;
                y[i]=1;
            }
        }
        printf("%d",y[0]);
        for(i=1;i<n;i++)
            printf(" %d",y[i]);
        return 0;
    }



    2.

    fatmouse准备米磅的猫食,准备与猫守卫仓库有他最爱吃的食品贸易,JavaBean。仓库有N个房间。第i个房间包含J [I] JavaBeans和要求磅F [我]磅猫食。FatMouse没有交易的房间,所有的JavaBeans相反,他可能会得到J [我] *一%磅的JavaBeans如果他支付F [我] *一%磅的猫食。这里A是实数。他现在是分配给你这个作业:告诉他,他能获得的最高金额的JavaBeans。
    输入由多个测试用例组成。每个测试用例以一行包含两个非负整数m和n开始,然后n行,每个包含两个非负整数j i和f i ]。最后一个测试用例后面是二到1个。所有的整数都不大于1000。
    对于每一个测试案例,在一行一个实数精确到小数点后3位的打印,即字母可以获得最大的JavaBeans量。
    Sample Input

    5 3
    7 2
    4 3
    5 2
    20 3
    25 18
    24 15
    15 10
    -1 -1


    Sample Output

    13.333
    31.500
    #include <stdio.h>
    int main()
    {
        int a,b,i,j,k;
        float c[100],d[100],e[100],sum=0,t;
        while(1)
        {
            sum=0;
            scanf("%d%d",&a,&b);
            if(a==-1&&b==-1)
                break;
            for(i=0; i<b; i++)
            {
                scanf("%f%f",&c[i],&d[i]);
                e[i]=(float)c[i]/d[i];
            }
            for(i=0; i<=b-2; i++)
            {
                k=i;
                for(j=i+1; j<b; j++)
                    if(e[j]>e[k])
                        k=j;
                t=e[k];
                e[k]=e[i];
                e[i]=t;
            }
            for(i=0; i<=b-2; i++)
            {
                k=i;
                for(j=i+1; j<b; j++)
                    if(c[j]/d[j]>c[k]/d[k])
                        k=j;
                t=c[k];
                c[k]=c[i];
                c[i]=t;
                t=d[k];
                d[k]=d[i];
                d[i]=t;
            }
            for(i=0; i<b; i++)
            {
                if(a>=d[i])
                {
                    sum+=c[i];
                    a-=(float)d[i];
                }
                else
                {
                    sum+=(float)(a*e[i]);
                    break;
                }
            }
            printf("%.3f
    ",sum);
        }
        return 0;
    
    }
    

    3.

    由于经济紧张,某国国王决定减少一部分多余的士兵,这些士兵在边界都有各自的管辖范围。例如,士兵x 的管辖范围[ax,bx]。我们定义:对于i号士兵,如果存在j号士兵的管辖范围[aj,bj], aji且bij成立,那么i号士兵就是多余的。给出多个士兵的管辖范围,问有多少个士兵是多余的?

    Input

     有多组数据,每组数据的第一行为一个整数n(1<=n<=100000),下面n行每行包含两个整数ai,bi,代表i号士兵的管辖范围(0<=aii<=200000)。所有的ai是不同的,bi也是不同的。

    Output

    输出多余士兵的个数。

    Sample Input

    5 
    0 10 
    2 9 
    3 8 
    1 15 
    6 11 

    Sample Output

    3
    #include <stdio.h>
    #include<string.h> 
    #include<algorithm> 
    using namespace std; 
    struct sold
    {    
       int beginn;     
       int endd;
    }a[100005]; 
    bool cmp(struct sold p,struct sold q) 
    {     
        return p.endd>q.endd; 
    } 
    int main() 
    {     
        int n,i,j,ans,minn;     
        while(scanf("%d",&n)!=EOF)     
        {         
            ans=0;         
            for(int i=0;i<n;i++)             
                scanf("%d%d",&a[i].beginn,&a[i].endd);         
            sort(a,a+n,cmp);         
            minn=a[0].beginn;         
            for(i=1;i<n;i++)         
            {             
               if(a[i].beginn>=minn)                
                   ans++;             
               else             
               {                 
                    minn=a[i].beginn;                 
                    continue;             
                }         
            }         
            printf("%d
    ",ans);     
        }     
        return 0; 
    } 

    4.

    “今年暑假不AC?” 
    “是的。” 
    “那你干什么呢?” 
    “看世界杯呀,笨蛋!” 
    “@#$%^&*%...” 


    确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。 
    作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目) 
    Input
    输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。 
    Output
    对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。 
    Sample Input

    12
    1 3
    3 4
    0 7
    3 8
    15 19
    15 20
    10 15
    8 18
    6 12
    5 10
    4 14
    2 9
    0 


    Sample Output


     

    #include <stdio.h>
    #include <string.h>
    #include <algorithm>
    using namespace std;
    struct AC{
       int beginn;
       int endd;
    }s[100001];
    bool cmp(struct AC p,struct AC q)
    {
        return p.endd<q.endd;
    }
    int main()
    {
        int n,i,j,ans,a,b;
        while(scanf("%d",&n)!=EOF)
        {
            ans=1;
            if(n==0)
                break;
            for(i=0;i<n;i++)
                scanf("%d%d",&s[i].beginn,&s[i].endd);
            sort(s,s+n,cmp);
            a=s[0].endd;
            for(i=1;i<n;i++)
            {
                if(s[i].beginn>=a)
                {
                    ans++;
                    a=s[i].endd;
                }
            }
            printf("%d
    ",ans);
        }
        return 0;
    }

    5.

    Input

    输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(0<n<=1000,0<m<=1000),分别表示经费的金额和大米的种类,然后是m行数据,每行包含2个整数p和h(1<=p<=25,1<=h<=100),分别表示单价和对应大米的重量。

    Output

    对于每组测试数据,请输出能够购买大米的最多重量(你可以假设经费买不光所有的大米)。 
    每个实例的输出占一行,保留2位小数。

    Sample Input

    1
    7 2
    3 3
    4 4
    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    struct TX{
        int p;
        int h;
    }a[100];
    double cmp(struct TX U,struct TX V)
    {
        return U.p<V.p;
    }
    int main()
    {
        int i,j,n,m,c;
        scanf("%d",&c);
        while(c--)
        {
            scanf("%d%d",&n,&m);
             for(i=0;i<m;i++)
             {
                 scanf("%d%d",&a[i].p,&a[i].h);
             }
             sort(a,a+m,cmp);
             double sum=0;
             for(i=0;i<m;i++)
             {
                 if(n>=a[i].p*a[i].h)
                 {
                    sum+=a[i].h;
                     n-=a[i].p*a[i].h;
                 }
                 else
                 {
                     sum+=(double)n/a[i].p;
                     break;
                 }
             }
        printf("%.2lf
    ",sum);
        }
        return 0;
    }
    
    
  • 相关阅读:
    merge sorted array
    Remove Duplicates from Sorted List
    climbing stairs(爬楼梯)(动态规划)
    点击事件加不上,换个位置调用
    The file couldn’t be opened because you don’t have permission to view it
    网络——性能调优
    SDWebImage缓存图片的机制(转)
    本地推送 简单代码演示
    UILable点击事件
    点击背景键盘退下
  • 原文地址:https://www.cnblogs.com/zcy19990813/p/9702840.html
Copyright © 2011-2022 走看看