題目描述:
新入職華為的小伙伴們都有在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;
}
