POJ 1042 Gone Fishing(贪心)

还可以用数据结构堆优化,还有待学习!

//贪心法 #include <iostream> using namespace std; struct lake { int f;//当前鱼的数量 int d;//减少量 int t;//步行所花时间 }la[26]; int fish[26];//记录当前状态每个湖所含鱼的数量 int sum[26];//以不同湖为结束点可以钓到的最大鱼数量 int rec[26][26];//记录以各个湖为钓鱼终点所花的次数,例如以第3个湖为结束点,第2个湖所花时间为rec[3][2]; int n,h,maximum,flag,max_fish,minute,time;//time为钓鱼次数 int main() { while(1) { memset(sum,0,sizeof(sum)); memset(rec,0,sizeof(rec)); memset(fish,0,sizeof(fish));//初始化 cin >> n; if(n == 0)break; cin >> h; for(int i = 1;i <= n;++i) cin >> la[i].f; for(int i = 1;i <= n;++i) cin >> la[i].d; for(int i = 2;i <= n;++i) cin >> la[i].t; la[1].t = 0; for(int i = 1;i <= n;++i)//穷举以每个湖作为结束点的情况 { minute = h * 60; for(int j = 1;j <= i;++j) minute -= la[j].t * 5;//因为没有折返情况,例如若以第3个湖为结束点,那么减去从第1个湖到第3个湖所画时间,则剩下的时间可以让JOHN瞬间移动,方便贪心进行 time = minute / 5;//可以钓鱼的次数 for(int j = 1;j <= i;++j) fish[j] = la[j].f;//将各个湖的鱼状态复制给fish数组 while(time > 0) { maximum = -1; for(int j = 1;j <= i;++j) { if(fish[j] > maximum) { maximum = fish[j]; flag = j; } }//贪心策略:找出当前状态哪个湖有最多鱼,则钓那个湖,而且只钓一次 sum[i] += fish[flag]; fish[flag] -= la[flag].d; if(fish[flag] < 0) fish[flag] = 0;//鱼的最少数量是0,所以置零很关键,否则会影响后续计算 rec[i][flag]++;//记录所花次数 --time; } } max_fish = -1; for(int i = 1;i <= n;++i) if(sum[i] > max_fish) { max_fish = sum[i]; flag = i; }//找出以哪个湖为结束点可以钓到的鱼最多 for(int i = 1;i < n;++i) cout << rec[flag][i]*5 <<", "; cout << rec[flag][n]*5 << endl; cout << "Number of fish expected: " << max_fish << endl << endl;//注意格式,两次换行 } return 0; } 

你可能感兴趣的:(POJ 1042 Gone Fishing(贪心))