题目描述:

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

输入示例:

5
100 70 5 5 55
1 2 2 2 3

输出:

 

表示两天就可以完成。

自己的解决思路:

这个题目的难点在于高难度的题目可以当做低难度的题目。
现将所有的题目按难度进行分类,并对每一类进行从大到小的排序。
首先,先做难度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题目:刷题的更多相关文章

  1. 华为OJ题目:扑克牌大小

    题目描述: 扑克牌游戏大家应该都比较熟悉了,一副牌由54张组成,含3~A.2各4张,小王1张,大王1张.牌面从小到大用如下字符和字符串表示(其中,小写joker表示小王,大写JOKER表示大王):3  ...

  2. 好像leeceode题目我的博客太长了,需要重新建立一个. leecode刷题第二个

    376. Wiggle Subsequence               自己没想出来,看了别人的分析. 主要是要分析出升序降序只跟临近的2个决定.虽然直觉上不是这样. 455. 分发饼干     ...

  3. Sublime Text3 配置C++(附oj刷题常用模板)

    # 下载对应平台的sublime sublime最新版下载, 字体样式个人喜欢Consolas, 另附注册码: -– BEGIN LICENSE -– TwitterInc 200 User Lice ...

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

    package t0815; /* * 华为编程题目:输入字符串括号是否匹配 * 若都匹配输出为0,否则为1 * 样例输入:Terminal user [name | number (1)] * 样例 ...

  5. 小米OJ刷题日志

    虽然这OJ上的题比较水,但还是挺有意思的.关键是能赚钱 特别是提交方式 居然不支持C++,垃圾OJ 4. 最长连续数列 排序后dp 5. 找出旋转有序数列的中间值 写个排序就做完了. 6. 交叉队列 ...

  6. XidianOJ 1020 ACMer去刷题吧

    题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...

  7. 【BZOJ-4590】自动刷题机 二分 + 判定

    4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 156  Solved: 63[Submit][Status ...

  8. BZOJ4590 自动刷题机

    Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写 ...

  9. HDU 自动刷题机 Auto AC (轻轻松松进入HDU首页)

    前言: 在写这篇文章之前,首先感谢给我思路以及帮助过我的学长们 以下4篇博客都是学长原创,其中有很多有用的,值得学习的东西,希望能够帮到大家! 1.手把手教你用C++ 写ACM自动刷题神器(冲入HDU ...

随机推荐

  1. Hive Over HBase

    1. 在hbase上建测试表 hbase(main)::> create 'test_hive_over_hbase','f' row(s) in 2.5810 seconds hbase(ma ...

  2. 例子:Background Agent Sample

    通过本例程学习: 后台代理Agent的使用方法 定期代理(PeriodicTask)来说,限制了: 有一些API不能使用,并不是说你不调用就可以了,只要你在同一个程序集里使用了这些API,就不会通过验 ...

  3. jq 操作radio,设置选中、获取选中值

    <label><input type="radio" name="sex" value="1">男</labe ...

  4. hdu 2073

    ps:感觉纯数学题.....我的思路就是找规律,发现dp(x+y) 就是 (0,x+y)的值,然后再加上x*根号2.就是他的距离.然后两个距离相减的绝对值就是两个点之间的距离了. 代码: #inclu ...

  5. M6: 使用摄像头(CameraCaptureUI)

    本小节介绍UWP中摄像头的使用,使用CameraCaptureUI来拍照,不仅能够获得图像,还能够对图像进行剪裁 (目前Mobile设备还上不支持). 在本例中, 单击Camera按钮调用摄像头来拍摄 ...

  6. I.MX6 eMMC 添加分区

    /********************************************************************************* * I.MX6 eMMC 添加分区 ...

  7. oracle 小知识

    oracle: 数值随机的函数是 dbms_random.value(最大值,最小值)   用法是select dbms_random(3,0) from dual; oracle: 获取前100条 ...

  8. poj 3463 最短路与次短路的方案数求解

    Sightseeing Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 8968   Accepted: 3139 Descr ...

  9. Linux版网易云音乐播放音乐时无限显示“网络错误”的解决办法

    安装 gstreamer0.10-plugins-good debian类系统: -plugins-good

  10. Array函数

    array_flip()例子 , , "c" );$trans = array_flip($trans);print_r($trans);?> 答案: Array ( [1] ...