其他分享
首页 > 其他分享> > 贪心——新田忌赛马

贪心——新田忌赛马

作者:互联网

贪心——新田忌赛马

题目描述

田忌和齐威王又开始赛马了,这一次齐威王为了增加难度,在每一匹马上都设置了一个刀币值,如果田忌赢了这匹马,那么他就可以获得相应的刀币,否则他就要失去相应的刀币(平局田忌也要失去刀币)。现在齐威王和田忌各有n匹马,每匹马有一个速度值,齐威王的每匹马还有一个刀币值,速度快的马会获得胜利,速度相同则是平局。现在齐威王已经排好了马的顺序,请你帮助田忌排兵布阵,并计算出他最多可以赢得多少刀币?(如果最后是输钱就请输出负数)。

例如:当有n=3匹马的时候
齐威王三匹马的速度为40, 30, 20
三匹马对应的刀币值为 1,2,3
田忌三匹马的速度为 20,30,50
齐威王的马顺序固定,田忌可以随意调动马匹出场顺序
当田忌出场顺序为 20,50,30 的时候
田忌会先失去一个刀币,再获得两个刀币,再获得三个刀币,故最后田忌赢得四个刀币,输出4,如果输了x个刀币就输出x的负数。

输入描述:

输入第一行包含一个整数T,代表测试案例个数。(5<=T<=10)
接下来每个测试案例都包括四行
第一行为一个整数n(0<n<=1000),代表马的个数。
第二行为n个整数,代表齐威王各匹马的速度。
第三行为n个整数,代表齐威王各匹马的刀币值(0<刀币值<=100),与速度值一一对应。
第四行为n个整数,代表田忌各匹马的速度。(0<速度值<=100)

输出描述:

输出田忌最多可以赢得的刀币值。

示例

输入

2
3
40 30 20
1 2 3
20 30 50
5
25 25 50 60 10
10 50 5 100 30
70 5 30 25 40

输出

4
185

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
	int a;
	int b;
}f[1001];
bool cmp(node x,node y)
{
	return x.b>y.b;
}
int main()
{
	int t,n,c[1001],vis[1001];
	cin>>t;
	while(t--){
		memset(vis,0,sizeof(vis));
		memset(c,0,sizeof(c));
		cin>>n;
		for(int i=0;i<n;i++){
			cin>>f[i].a;
		}
		for(int i=0;i<n;i++){
			cin>>f[i].b;
		}
		sort(f,f+n,cmp);
		for(int i=0;i<n;i++){
			cin>>c[i];
		}
		sort(c,c+n);
		int sum=0;
		for(int i=0;i<n;i++){
			int x=upper_bound(c,c+n,f[i].a)-c;
			while(vis[x]){
				x++;
			}
			if(x<n){
				vis[x]=1;
				sum+=f[i].b;
			}
			else{
				sum-=f[i].b;
			}
		}
		cout<<sum<<endl;
	}
	return 0;
}
linjiayina 发布了75 篇原创文章 · 获赞 2 · 访问量 2862 私信 关注

标签:刀币,20,田忌赛马,int,30,齐威王,田忌,贪心
来源: https://blog.csdn.net/linjiayina/article/details/104056264