寒假里做的第一道题,结结实实的被特给虐了。。华丽丽的WA了不下20次,最后没办法了还是让别人给找出来的错!悲催...
这题用贪心,枚举到第i个岛结束,从总时间里减掉走到这个岛所用时间。然后从前i个岛里贪心出最大值。
错在两个地方:
1. 题目要求多余的时间放到第一个岛上,我在选取的max为负里加上了cur=0,把时间直接加到了第一个岛上。
其实这里不需要单独处理,在贪心前已经让cur=0,如果max<0.fish,cur不改变。简直多此一举
2. fish数量为负时的清零跟递减的顺序,我是清零后使cur=0,然后对f[0]递减。
这样操作对fish为负的情况可以,但fish递减后为负的情况就没办法处理了,可能造成后面贪心过程中岛的选取的错误。
#include<iostream>
#include<fstream>
#include<cstring>
#include<cstdlib>
#define Max(a, b) a>b?a:b
using namespace std ;
struct F{
int fish ;
int desc ;
int walk ;
};
F f[30] ;
F ftemp[30] ;
int time[30][30] ;
int sum[30] ;
int main(){
int n, h, total, i, j, max, maxf, cur, temp ;
//fstream cin("in.dat", ios::in) ;
while(~scanf("%d", &n)&&n){
scanf("%d", &h) ;
for(i=0; i<n; i++)
scanf("%d", &f[i].fish) ;
for(i=0; i<n; i++)
scanf("%d", &f[i].desc) ;
for(i=1; i<n; i++)
scanf("%d", &f[i].walk) ;
total = 12 * h ;
f[0].walk = 0 ;
memset(time, 0, sizeof(time)) ;
memset(sum, 0, sizeof(sum)) ;
for(i=0; i<n; i++){ //枚举到第i个湖结束
total -= f[i].walk ;
temp = total ;
memcpy(ftemp, f, (i+1)*sizeof(F)) ;
while(temp>0){ //贪心
maxf = ftemp[0].fish ;
cur = 0 ; //每次贪心开始标记的位置cur=0确保了剩余时间归属
for(j=1; j<=i; j++){
if(maxf<ftemp[j].fish){
maxf = ftemp[j].fish ;
cur = j ;
}
}
sum[i] += ftemp[cur].fish ;
ftemp[cur].fish -= ftemp[cur].desc ;
//这里要递减完再解决非正情况
if(ftemp[cur].fish<0)
ftemp[cur].fish = 0 ;
time[i][cur] ++ ;
temp -- ;
}
}
max = -1 ;
cur = 0 ;
for(i=0; i<n; i++){
if(sum[i]>max){
max = sum[i] ;
cur = i ;
}
}
cout << time[cur][0]*5 ;
for(i=1; i<n; i++)
cout << ", " << time[cur][i]*5 ;
cout << endl << "Number of fish expected: " << sum[cur] << endl << endl ;
}
#include<fstream>
#include<cstring>
#include<cstdlib>
#define Max(a, b) a>b?a:b
using namespace std ;
struct F{
int fish ;
int desc ;
int walk ;
};
F f[30] ;
F ftemp[30] ;
int time[30][30] ;
int sum[30] ;
int main(){
int n, h, total, i, j, max, maxf, cur, temp ;
//fstream cin("in.dat", ios::in) ;
while(~scanf("%d", &n)&&n){
scanf("%d", &h) ;
for(i=0; i<n; i++)
scanf("%d", &f[i].fish) ;
for(i=0; i<n; i++)
scanf("%d", &f[i].desc) ;
for(i=1; i<n; i++)
scanf("%d", &f[i].walk) ;
total = 12 * h ;
f[0].walk = 0 ;
memset(time, 0, sizeof(time)) ;
memset(sum, 0, sizeof(sum)) ;
for(i=0; i<n; i++){ //枚举到第i个湖结束
total -= f[i].walk ;
temp = total ;
memcpy(ftemp, f, (i+1)*sizeof(F)) ;
while(temp>0){ //贪心
maxf = ftemp[0].fish ;
cur = 0 ; //每次贪心开始标记的位置cur=0确保了剩余时间归属
for(j=1; j<=i; j++){
if(maxf<ftemp[j].fish){
maxf = ftemp[j].fish ;
cur = j ;
}
}
sum[i] += ftemp[cur].fish ;
ftemp[cur].fish -= ftemp[cur].desc ;
//这里要递减完再解决非正情况
if(ftemp[cur].fish<0)
ftemp[cur].fish = 0 ;
time[i][cur] ++ ;
temp -- ;
}
}
max = -1 ;
cur = 0 ;
for(i=0; i<n; i++){
if(sum[i]>max){
max = sum[i] ;
cur = i ;
}
}
cout << time[cur][0]*5 ;
for(i=1; i<n; i++)
cout << ", " << time[cur][i]*5 ;
cout << endl << "Number of fish expected: " << sum[cur] << endl << endl ;
}
}
错误代码块:
maxf = ftemp[0].fish ;
cur = 0 ;
for(j=1; j<=i; j++){
if(maxf<ftemp[j].fish){
maxf = ftemp[j].fish ;
cur = j ;
}
}
if(ftemp[cur].fish<=0){
ftemp[cur].fish = 0 ;
cur = 0 ;
}
sum[i] += ftemp[cur].fish ;
ftemp[cur].fish -= ftemp[cur].desc ;
time[i][cur] ++ ;
cur = 0 ;
for(j=1; j<=i; j++){
if(maxf<ftemp[j].fish){
maxf = ftemp[j].fish ;
cur = j ;
}
}
if(ftemp[cur].fish<=0){
ftemp[cur].fish = 0 ;
cur = 0 ;
}
sum[i] += ftemp[cur].fish ;
ftemp[cur].fish -= ftemp[cur].desc ;
time[i][cur] ++ ;
temp -- ;