最近郭大侠迷上了玩Rabi-Ribi这个游戏。
Rabi-Ribi呢,是一个打兔子的动作冒险游戏,萌萌哒的兔子在地上跑来跑去,好萌好萌呀~
这个游戏是这样玩的,郭大侠作为一个主角,拿着一个小锤子,他的目标是敲晕兔子,然后最后把这些敲晕的兔子都带回家。
当然咯,郭大侠想带回的兔子的总价值最高~
但是,兔子实在是太多了,郭大侠的锤子每一秒钟只能敲晕一只兔子,而且每一只兔子只会在地面上逗留 a[i] 秒,在 a[i] 秒之后,这一只兔子就会跑回自己的小窝里面。
所以郭大侠面临一些抉择,希望你能帮助他。
第一行包含一个整数 N 表示有 N 个兔子在地上跑来跑去。
第二行 N 个用空格分隔的整数 a[i] 表示第i只兔子冒出后停留的时间
第三行 N 个用空格分隔的整数 v[i] 表示第i只兔子的价值。
1≤N≤100000
1≤a[i]≤5000
1≤v[i]≤1000
输出郭大侠最多能获得的价值是多少
5 5 3 6 1 4 7 9 2 1 5
3 1 1 1 1 2 3
24
3
死宅真可怕,连可爱的兔子都要敲晕带回家 QAQ
思路 :哎~~这个明明是原题,比赛的时候,是我打的。。 没想到 我的代码有BUG,,最可怕的还是 我觉得没有错。。。最后还是 队友换个写法 才过。。。 我的锅,,,
代码
#include<stdio.h>
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#define INF 0x3f3f3f3f
#define MOD 10000009
#define M 1000000
#define LL long long
using namespace std;
struct data
{
int time,value;
};
data rob[M];
int vis[M];
int cmp(data a,data b)
{
return a.value>b.value;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
int i,j;
for(i=0;i<n;i++)
scanf("%d",&rob[i].time);
for(i=0;i<n;i++)
scanf("%d",&rob[i].value);
sort(rob,rob+n,cmp);
memset(vis,0,sizeof(vis));
int sum=0;
for(i=0;i<n;i++)
{
for(j=rob[i].time;j>=1;j--)
{
if(!vis[j])
{
sum+=rob[i].value;
vis[j]=1;
break;
}
}
}
printf("%d\n",sum);
}
return 0;
}