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\n");
    printf("%d\n",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\n",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\n",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\n",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\n",sum);
    }
    return 0;
}

 

 

posted @ 2018-03-27 17:33  ~~zcy  阅读(144)  评论(0编辑  收藏  举报