1. 程式人生 > >【貪心】趕作業

【貪心】趕作業

date == algo ide long 作業 esp 測試用例 正整數

題目描述

小墨老師總是不及時做作業,所以他總有很多的作業要做。每個老師都給了他一個完成作業的最後期限,如果他超過期限交作業,老師就會在他的期末評價中扣分。假設做每一門作業總是要一天。小墨老師希望你能夠幫助他安排做作業的一個順序,以便能夠被扣掉的分數最少。

輸入

輸入包含了多個測試用例。輸入的第一行是一個整數T,代表測試用例的個數。接下來的就是T個測試用例的輸入。每個測試用例都從一個正整數N(1≤N≤1000)開始,代表了作業的數目。接下來有2行。第一行包含N個整數,分別代表各個作業提交的最後期限;第二行也有N個整數,即對應於各個作業超過時間提交的扣分。

輸出

對每一個測試用例,應該在一行中輸出最小的扣分數。

樣例輸入

2
3
3 3 3
10 5 1
3
1 3 1
6 2 3

樣例輸出

0

3

技術分享圖片
#include <iostream>
#include <string>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>
#include <map>
#define range(i,a,b) for(int i=a;i<=b;++i)
#define
LL long long #define rerange(i,a,b) for(int i=a;i>=b;--i) #define fill(arr,tmp) memset(arr,tmp,sizeof(arr)) using namespace std; struct node{ int date,score,sd; }sub[1005]; bool vis[1005]; bool cmp(node a,node b){ return a.score>b.score||a.score==b.score&&a.date<b.date; } int t,n;
void init(){ cin>>t; } void solve(){ while(t--){ fill(vis,0); cin>>n; range(i,1,n)cin>>sub[i].date; range(i,1,n){ cin>>sub[i].score; sub[i].sd=0; } sort(sub+1,sub+1+n,cmp);int ans=0; range(i,1,n) { rerange(j, sub[i].date, 1) if (!vis[j]) { vis[j] = true; sub[i].sd = 1; break; } if(!sub[i].sd)ans+=sub[i].score; } cout<<ans<<endl; } } int main() { init(); solve(); return 0; }
View Code

【貪心】趕作業