您的位置:首页 > 其它

箭无虚发

2016-06-04 15:08 239 查看
题目链接:http://acm.hfut.edu.cn/OnlineJudge/

题目:

Description

       JH苦练10年,终于成为了一个神箭手,在下山之前,大师兄YZ不放心,想考验他,只给他一定时间t,同时给他n支箭,最终根据他的表现,考虑他是否能下山。
       对于每发一次箭,YZ给他4种成绩(优、良、中、差),JH有三种拉弓以及瞄准时间a ,b,c(a>=b>=c)分别能拿优,良,中等级,如果不拉弓不瞄(直接射),只能拿差(不能中靶)了。

       现在JH想知道,在保证自己弹无虚发(不获得差)的情况下,最多能拿多少个优。

       如果JH不能做到弹无虚发,输出Oh,my god! 

Input

       输入数据包含T组:
       对于每组数据,第一行为一个整数n,表示总共有n支箭。

(0<n<=1000)

       之后n行,每行包含三个数字a,b,c,分别表示拿对应等级所需要花的时间。

       (0<c<=b<=a<=1000)

之后一个数字t,表示JH有考核总时间为t

       (0<=t<=1e6)

Output

对于每组输入,如果JH能箭无虚发,则输出一个数字x,表示最多能拿到的优的数量。如果不能,则输出Oh,my god!

Sample Input

3

1

3 2 1

1

2

3 2 1

3 2 1

4

2

3 2 1

3 2 1

1

Sample Output

0

1

Oh,my god!

分析:比赛的时候被这道题目卡住了,后来就没出过题。现在有n支箭,射箭有优
4000
、良、差三种结果,想要得到每种结果需要不同的瞄准时间,分别是a,b,c,并且a>=b>=c,给总时间t,如果不能全部射中,即至少是差,则输出"Oh, my god!",否则,输出能够得到最多的优的数量。刚开始的思路是贪心,进行排序,a越小排在前面,a相同则c越小排在前面。然后加入答案是ans=n,每次取ai,time=time+ai,如果time大于t则取ci,然后ans--。
正解:sum=c1+c2+……+cn,然后把di=ai-ci排序,t-sum看可以去多少di,就是答案。也就是说ci是必须要花费的时间,至于是否取优,则贪心选取。
代码:
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<cmath>
#include<vector>
#include<cstdio>
#include<stdlib.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;

#define pb(a) push_back(a)
#define mp(a,b) make_pair(a,b)
#define in(a) scanf("%d",&a)
#define mm(a,b) memset(a,b,sizeof(a))
#define out(a) printf("%d\n",a)
#define MOD =1e9+7
#define ll long long
#define INF 0x3f3f3f3f
#define FOR(i,l,r) for(int i=l;i<=r;i++)

int d[1005];
int n,sum;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
sum=0;
for(int i=0;i<n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
sum+=c;
d[i]=a-c;
}
int time;
scanf("%d",&time);
if(sum>time)
{
printf("Oh,my god!\n");
continue;
}
int ans=0;
sort(d,d+n);
for(int i=0;i<n;i++)
{
if(sum+d[i]<=time)
{
ans++;
sum+=d[i];
}
else break;
}
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: