一、算法分析
本题是一道比较简单的贪心题目,想法也很直观,先按照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 · 访问量 1094
私信
关注