华为OJ题目

题目描述:

新入职华为的小伙伴们都有在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题目

时间: 2024-12-23 00:26:23

华为OJ题目的相关文章

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返

OJ——华为编程题目:输入字符串括号是否匹配

package t0815; /* * 华为编程题目:输入字符串括号是否匹配 * 若都匹配输出为0,否则为1 * 样例输入:Terminal user [name | number (1)] * 样例输出:0 * Java版本 */ /* * 个人总结: * (1)语法上Java的输入Scanner使用 * (2)char[] arr=mxf.toCharArray()的使用,将输入的字符串转成字符数组:这样就可以一个 * 一个的遍历 * (3)算法上,这里使用了经典的入栈和出栈的思想 * */

华为OJ:汽水瓶

题目有点像小学数学题,因为三个空瓶可以换一瓶汽水,但喝完一瓶汽水就可以得到一个空瓶.所以相当于两个空瓶就可以换到一瓶汽水. 把输入除以2即可.这里讲一下java多出入,可以用in.hasNext(),就相当于C/C++里面的while(scanf("%d",n)!=EOF). import java.util.Scanner; public class qishuiping { public static void main(String args[]){ Scanner input=

华为OJ:分段排序

题目有点绕,一个是要二分,用三个字符串,存前,中,后三个,前,后部分都降序排序,然后后半部分再反转一下,讲三部分合起来就好了. import java.util.Scanner; public class dividesort { public static void sort(StringBuffer s){ for(int i=0;i<s.length();i++){ for(int j=i;j<s.length();j++){ if(s.charAt(i)>s.charAt(j))

【华为OJ】【044-超长正整数相加】

[华为OJ][算法总篇章] [华为OJ][044-超长正整数相加] [工程下载] 题目描述 请设计一个算法完成两个超长正整数的加法. 接口说明 /** * 请设计一个算法完成两个超长正整数的加法. * 输入参数: * String addend:加数 * String augend:被加数 * 返回值:加法结果 */ public String addLongInteger(String addend, String augend) { /*在这里实现功能*/ return null; } 输入

【华为OJ】【094-多线程】

[华为OJ][算法总篇章] [华为OJ][094-多线程] [工程下载] 题目描述 问题描述:有4个线程和1个公共的字符数组.线程1的功能就是向数组输出A,线程2的功能就是向字符输出B, 线程3的功能就是向数组输出C,线程4的功能就是向数组输出D.要求按顺序向数组赋值ABCDABCDABCD, ABCD的个数由线程函数1的参数指定. 输入描述: 输入一个int整数 输出描述: 输出多个ABCD 输入例子: 10 输出例子: ABCDABCDABCDABCDABCDABCDABCDABCDABCD

【华为OJ】【092-学英语】

[华为OJ][算法总篇章] [华为OJ][092-学英语] [工程下载] 题目描述 Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文: 如22:twenty two,123:one hundred and twenty three. 说明 数字为正整数,长度不超过十位,不考虑小数,转化结果为英文小写: 输出格式为twenty two: 非法数据请返回"error": 关键字提示:and,billion,million,thousand,hundred. 方法原型:pu

【华为OJ】【091-数据分类处理】

[华为OJ][算法总篇章] [华为OJ][091-数据分类处理] [工程下载] 题目描述 信息社会,有海量的数据需要分析处理,比如公安局分析身份证号码.QQ用户.手机号码.银行帐号等信息及活动记录. 采集输入大数据和分类规则,通过大数据分类处理程序,将大数据分类输出. 输入描述: ?一组输入整数序列I和一组规则整数序列R,I和R序列的第一个整数为序列的个数(个数不包含第一个整数):整数范围为0~0xFFFFFFFF,序列个数不限 输出描述: ?从R依次中取出R<i>,对I进行处理,找到满足条件

【华为OJ】【082-字符串通配符】

[华为OJ][算法总篇章] [华为OJ][082-字符串通配符] [工程下载] 题目描述 问题描述:在计算机中,通配符一种特殊语法,广泛应用于文件搜索.数据库.正则表达式等领域.现要求各位实现字符串通配符的算法. 要求: 实现如下2个通配符: *:匹配0个或以上的字符(字符由英文字母和数字0-9组成,不区分大小写.下同) ?:匹配1个字符 输入描述 通配符表达式: 一组字符串. 输出描述 返回匹配的结果,正确输出true,错误输出false 输入例子 先输入一个带有通配符的字符串,再输入一个需要