码迷,mamicode.com
首页 > 其他好文 > 详细

华为OJ题目

时间:2014-08-17 18:28:22      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   io   for   ar   art   

题目描述:

新入职华为的小伙伴们都有在oj上面刷题的任务,共需要刷100道初级题,45道中级题,5道高级题,其中,做出来的高级题如果超标可以当初级或者中级题,做出来的中级题如果超标可以当初级题。每天,出题的大哥会给大家出Xi道题,这Xi道题属于同一个难度级别,小伙伴们要么用一天时间把这些题全做出来,要么就不做。现在,给你每天出题大哥出的题数以及难度,请问,小伙伴们最少要挑选其中几天去做题,才能把这150道题的任务完成呢?

输入示例:

5
100 70 5 5 55
1 2 2 2 3

输出:

 2

表示两天就可以完成。

 

自己的解决思路:

这个题目的难点在于高难度的题目可以当做低难度的题目。
现将所有的题目按难度进行分类,并对每一类进行从大到小的排序。
首先,先做难度3的题目,如果难度三的题目搞定了 ,再将剩下的难度二和难度三的题目进行排序。在此基础上,再做难度二的。做完难度二以后,再将剩下的所有题目进行排序。在此基础上再做难度一的题目。
 
实现代码:

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
#define LOWLEVEL 100
#define MIDLEVEL 45
#define UPLEVEL  5
bool MoreThan(int a,int b)
{
	return a > b;
}
int theMax(int a,int b,int c)
{
	return (a>b?(a>c?a:c):(b>c?b:c));
}
void display(char* str,vector<int> &src)
{
	int i,n;
	n = src.size();
	cout<<str<<" : ";
	for (i = 0; i < n; i++)
	{
		cout<<src[i]<<" ";
	}
	cout<<endl;
}
void OJDoWorks(int days,vector<int> &numbers,vector<int> &nandu)
{
	int i,n;
	int dayOver,flagu,flagm,flagl;
	int lowsum,midsum,upsum;
	vector<int> lowv, midv, upv,sortv,sortlv;
	n = numbers.size();
	flagl = flagm = flagu = -1;
	lowsum = midsum = upsum = dayOver = 0;
	//将题目进行分类
	for (i = 0; i < n; i++)
	{
		if (nandu[i] == 1)
		{
			lowv.push_back(numbers[i]);
		}
		else if (nandu[i] == 2)
		{
			midv.push_back(numbers[i]);
		}
		else
		{
			upv.push_back(numbers[i]);
		}
	}
	//按大小进行排序
	sort(upv.begin(),upv.end(),MoreThan);
	sort(midv.begin(),midv.end(),MoreThan);
	sort(lowv.begin(),lowv.end(),MoreThan);
	
	display("up",upv);
	display("mid",midv);
	display("low",lowv);
	n = theMax(upv.size(),midv.size(),lowv.size());
	
	//先把高级的做满
	for(i = 0; i < upv.size();i++)
	{
		dayOver++;
		upsum += upv[i];
		if (upsum >= UPLEVEL)
		{
			flagu = i;
			break;
		}
	}
	//高级题目不够
	if (flagu < 0)
	{
		return;
	}
	midsum = upsum - UPLEVEL;
	//将剩下的高级和中级的题目进行排序
	for (i = flagu+1; i< upv.size(); i++)
	{
		sortv.push_back(upv[i]);
	}
	for (i = 0; i < midv.size(); i++)
	{
		sortv.push_back(midv[i]);
	}
	sort(sortv.begin(),sortv.end(),MoreThan);
	display("sort mid:",sortv);
	//再把中级的做满
	n = sortv.size();
	for (i = 0; i < n; i++)
	{
		if (midsum >= MIDLEVEL)
		{
			flagm = i;
			break;
		}
		dayOver++;
		midsum += sortv[i];
	}
	//中级题目数量不够
	if (flagm < 0)
	{
		return;
	}
	lowsum = midsum - MIDLEVEL;
	//再做低级的题目
	for ( i = flagm; i < n; i++)
	{
		sortlv.push_back(sortv[i]);
	}
	for (i = 0; i < lowv.size(); i++)
	{
		sortlv.push_back(lowv[i]);
	}
	sort(sortlv.begin(),sortlv.end(),MoreThan);
	display("sort low",sortlv);
	n = sortlv.size();
	
	for (i = 0; i < n; i++)
	{
		if (lowsum >= LOWLEVEL)
		{
			flagl = i;
			break;
		}
		dayOver++;
		lowsum += sortlv[i];
	}
	if ((upsum >= UPLEVEL) && (midsum >= MIDLEVEL) && (lowsum >= LOWLEVEL))
	{
		cout<<dayOver<<endl;
	}
	else
	{
		return;
	}
}
int main()
{
	//fstream in("data.txt");
        int n,i,value;
	vector<int> numbers,nandu;
	
	cin>>n;
	for (i = 0; i < n; i++)
	{
		cin>>value;
		numbers.push_back(value);
	}
	for (i = 0; i < n; i++)
	{
		cin>>value;
		nandu.push_back(value);
	}
	OJDoWorks(n,numbers,nandu);
	
	cout<<endl;
	return 0;
}

  

华为OJ题目,布布扣,bubuko.com

华为OJ题目

标签:style   blog   color   os   io   for   ar   art   

原文地址:http://www.cnblogs.com/xingma0910/p/3917979.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!