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