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