(细节处理)P3093 [USACO13DEC]牛奶调度Milk Scheduling

一、算法分析

本题是一道比较简单的贪心题目,想法也很直观,先按照g由大到小排,如果g相等再按d由小到大排即可。但是对于题目中的时间的细节处理却困扰了自己不少。仔细想想还是没有领会题意所致,巧的是,自己之前的错误代码,竟然恰好能过样例(说明样例很水),于是自己就一直没有认识到自己程序的问题。所以反思一下,今后还是应该在样例比较水的情况下,自己手算几个样例出来进行对比。
本题细节处理的地方就在于挤奶的时间占用上,这里要额外做一次循环进行占用时间。

二、代码及注释

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<vector>
using namespace std;
const int maxn=10005;
int tim[maxn];                         //判断某个时间是否被占用 
int n;
struct cow{
	int g;
	int d;
	cow(int u,int v):g(u),d(v){} 
};
vector<cow> a;
bool cmp(cow x1,cow x2){
  if(x1.g!=x2.g) return x1.g>x2.g;
  else return x1.d<x2.d;
}
int vis[maxn];
int ans;
int main(){

	cin>>n;
	int xx,yy;
	for(int i=1;i<=n;i++){
		cin>>xx>>yy;
		a.push_back(cow(xx,yy));
	}
	sort(a.begin(),a.end(),cmp);
	for(int i=0;i<n;i++){                 //开始依次占用挤奶时间 
		int failed=1;                       //是否占用成功的标记 
		int k=a[i].d;
		for(int j=k;j>=1;j--){               //从后向前占用时间 
	    if(!tim[j]){
	    	failed=0;
	    	tim[j]=1;                       //占用成功 
				break;
			}
		}
		if(!failed) ans+=a[i].g;
	}
	
	cout<<ans;

	return 0;
} 
发布了50 篇原创文章 · 获赞 7 · 访问量 1092

猜你喜欢

转载自blog.csdn.net/numb_ac/article/details/103995989