刷題記錄24

Roci發表於2020-12-02

【對比演算法】
連結:https://ac.nowcoder.com/acm/contest/950/E
來源:牛客網
刷題記錄15
小偉報名參加中央電視臺的智力大沖浪節目。本次挑戰賽吸引了眾多參賽者,主持人為了表彰大家的勇氣,先獎勵每個參賽者m元。先不要太高興!因為這些錢還不一定都是你的?!接下來主持人宣佈了比賽規則:
首先,比賽時間分為n個時段,它又給出了很多小遊戲,每個小遊戲都必須在規定期限ti前完成。如果一個遊戲沒能在規定期限前完成,則要從獎勵費m元中扣去一部分錢w_iw
i,w_iw i 為自然數,不同的遊戲扣去的錢是不一樣的。當然,每個遊戲本身都很簡單,保證每個參賽者都能在一個時段內完成,而且都必須從整時段開始。主持人只是想考考每個參賽者如何安排組織自己做遊戲的順序。作為參賽者,小偉很想贏得冠軍,當然更想贏取最多的錢!注意:比賽絕對不會讓參賽者賠錢!
【程式碼】

    sort(a+1,a+n+1,cmp);  //從a+1開始,到a+n+1結束,呼叫cmp程式
    int ans=0,t=0;
    for(int i=1;i<=n;i++){  //將能完成的結束迴圈,剩下的為不能完成的
        int tag=0;
        for(int j=a[i].t;j;j--){
            if(vis[j]==0){
                vis[j]=1;
                tag=1;
                break;
            }
        }
        if(tag==0){
            for(int j=n;j;j--){
                if(vis[j]==0){
                    vis[j]=1;
                    break;
                }
            }
            ans+=a[i].val;  //將不能完成的權值相加
        }
    }
   cout<<m-ans;   //注意:輸出為m-ans
    return 0;
}

刷題記錄23
老師在開學第一天就把所有作業都佈置了,每個作業如果在規定的時間內交上來的話才有學分。每個作業的截止日期和學分可能是不同的。例如如果一個作業學分為 10,要求在 6 天內交,那麼要想拿到這 10 學分,就必須在第 6 天結束前交。每個作業的完成時間都是隻有一天。例如,假設有 7 次作業的學分和完成時間如下:最多可以獲得15學分,其中一個完成作業的次序為2,6,3,1,7,5,4,注意可能還有其他方法。
你的任務就是找到一個完成作業的順序獲得最大學分
【程式碼】

sort(a,a+n,cmp);  //根據cmp進行排序
	int time=0;
	int num=0;
	for(int i=0;i<n;i++){
		bool flag=false;  //運用布林變數進行判斷相應的陣列是否輸出
		if(a[i].t<time)continue;  //如果時間小於0,則跳出迴圈
		for(int j=a[i].t;j>=1;j--){  
			if(v[j]==0){
				v[j]=1;
				num+=a[i].m;  //學分相加
				flag=true;  //布林變數為真
				break;
			}
		}
		if(!flag){  //布林變數為假,將學分的值存進time中
			time=a[i].t;
		}
	}
	cout<<num;  //輸出學分
	return 0;
}

【感悟】
對比以上兩個演算法,第一個要求輸出不符合條件的陣列值,第二個要求輸出符合條件的值,他們都是同一個演算法。要求符合條件的輸出,運用bool變數進行篩選,最後只需把他們的值相加;而要求輸出不符合條件的則需將所有符合條件的值都跳出迴圈,也可以試用bool變數來解決。