/*一开始理解错了,以为是个线段覆盖,后来发现线段只有上下界,具体的端点是没有的。
贪心法:处理出每个点在最大停留时间的剩余时间,先处理剩余时间少的,也就是在一个地鼠即将下地的前一秒敲它。如果有同样好几个时间少,就取分数最大的。
*/
#include<iostream>
using namespace std;
#include<cstdio>
#include<algorithm>
#define N 132
struct Ds{
int tim,fs;
bool operator<(Ds p)
const{return tim<p.tim;}
}ds[120];
int n,maxsytim=0,ans=0,sum;
bool visit[N];
void input()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&ds[i].tim);
sum=max(sum,ds[i].tim);
}
for(int i=1;i<=n;++i)
{
ds[i].tim=sum-ds[i].tim;
maxsytim=max(maxsytim,ds[i].tim);
}
for(int i=1;i<=n;++i)
scanf("%d",&ds[i].fs);
}
int main()
{
input();
sort(ds+1,ds+n+1);
for(int j=0;j<sum;++j)/*注意sum这里不是maxsysum,因为这个不是敲地鼠的总时间,而且要小于sum,因为敲一个地鼠需要一秒钟*/
{
int temp,kkk=0;
for(int i=1;i<=n;++i)
{
if(ds[i].tim<=j&&!visit[i]&&ds[i].fs>kkk)
{
kkk=ds[i].fs;
temp=i;
}
}
visit[temp]=true;
ans+=kkk;
}
printf("%d",ans);
return 0;
}
- 总时间限制:
- 10000ms
- 内存限制:
- 65536kB
- 描述
- 有一个神奇的口袋,总的容积是40,用这个口袋可以变出一些物品,这些物品的总体积必须是40。John现在有n个想要得到的物品,每个物品的体积分别是a1,a2……an。John可以从这些物品中选择一些,如果选出的物体的总体积是40,那么利用这个神奇的口袋,John就可以得到这些物品。现在的问题是,John有多少种不同的选择物品的方式。
- 输入
- 输入的第一行是正整数n (1 <= n <= 20),表示不同的物品的数目。接下来的n行,每行有一个1到40之间的正整数,分别给出a1,a2……an的值。
- 输出
- 输出不同的选择物品的方式的数目。
- 样例输入
-
3
20
20
20
- 样例输出
- 3
#include<iostream>
using namespace std;
#include<cstdio>
int n;
int a[25];
int f[45]={0};
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
f[0]=1;
for(int i=1;i<=n;++i)
for(int j=40;j>=a[i];--j)
f[j]+=f[j-a[i]];
printf("%d\n",f[40]);
return 0;
}
4.NOI 2393:Going to the Movies
- 总时间限制:
- 10000ms
- 单个测试点时间限制:
- 1000ms
- 内存限制:
- 65536kB
- 描述
- Farmer John is taking some of his cows to the movies! While his truck has a limited capacity of C (100 <= C <= 5000) kilograms, he wants to take the cows that, in aggregate, weigh as much as possible without exceeding the limit C.
Given N (1 <= N <= 16) cows and their respective weights W_i, determine the weight of the heaviest group of cows that FJ can take to the movies. - 输入
- * Line 1: Two space-separated integers: C and N
* Lines 2..N+1: Line i+1 contains a single integer: W_i - 输出
- * Line 1: A single integer that is the weight of the heaviest group of cows that can go to the movies
- 样例输入
-
259 5
81
58
42
33
61
- 样例输出
-
242
- 提示
- 81+58+42+61 = 242;
this is the best possible sum
#include<iostream>
using namespace std;
#include<cstdio>
#define C 5101
bool f[C]={0};
int n,c;
int w[20];
int main()
{
scanf("%d%d",&c,&n);
for(int i=1;i<=n;++i)
scanf("%d",&w[i]);
f[0]=true;
for(int i=1;i<=n;++i)
for(int j=c;j>=w[i];--j)
f[j]=f[j]||f[j-w[i]];
for(int j=c;j>=0;--j)
{
if(f[j])
{
printf("%d\n",j);
break;
}
}
return 0;
}
5