#10282: 只對60%,求解


eddiehy (eddie)


大傢好,我剛學C兩週, 第一次到此解題,前三筆測資OK, 後二筆答案不同

我的解題邏輯為先把分數由大排到小,在加總,如果大於700k就減掉然後加下ㄧ個

程式碼如下,請大家指點一下,謝謝

#include <stdio.h>
#define student 105
int main()
{
 int score[student]={0};
 int num,i,j,min,temp;
 scanf("%d",&num);
 for(i=0;i<num;i++)
 {
  scanf("%d",&score[i]);  //取得成績
  if (score[i]>700000)
  {
   score[i]=0;
        }
 }
 
 for (i=0;i<num;i++)
 {
  min=i;
  for (j=i+1;j<num;j++)
  {
   if (score[min]>score[j])  //前面要比較小,取得最小值位址
   {
    min=j;
   }
  }
  temp = score[i];
  score[i]=score[min];
  score[min]=temp;
 }
 int sum=0;
 for (i=num-1;i>=0;i--)
 {
  //printf("%d\n",score[i]);
    sum = sum +score[i];
    if (sum>700000)
    {
     sum = sum - score[i];
     continue;
    }
  }
  printf("%d\n",sum);
 return 0;
 }

#10283: Re:只對60%,求解


eddiehy (eddie)


是針對題目B568,不小心貼到這了




#10285: Re:只對60%,求解


lwcQQ (lwc)


3
699999 699998 2

這筆輸入你的程式就錯誤了
這題實際上要用 Dynamic Programming 求解
才剛開始學 C 不建議解這題,不過如果有興趣可以自己 Google
#10287: Re:只對60%,求解


eddiehy1 (eddiehy)


3
699999 699998 2

這筆輸入你的程式就錯誤了
這題實際上要用 Dynamic Programming 求解
才剛開始學 C 不建議解這題,不過如果有興趣可以自己 Google

謝謝你


#10293: Re:只對60%,求解


eddiehy1 (eddiehy)


3
699999 699998 2

這筆輸入你的程式就錯誤了
這題實際上要用 Dynamic Programming 求解
才剛開始學 C 不建議解這題,不過如果有興趣可以自己 Google

謝謝你


針對你提出的問題,我又改了一版, 但還是60% ><

把各種可能得和算出來,再去取最大值

699999 699998 2

699999 350005 349998 349995 (跳加得出最大值)

都可以得出70k了, 還是60%, 苦惱阿

程式碼如下

#include <stdio.h>
#define student 105
int main()
{
 int score[student]={0};
 int num,i,j,min,temp;
 scanf("%d",&num);
 if (num<0) num=0;
 if (num>100) num=100;
 for(i=0;i<num;i++)
 {
  scanf("%d",&score[i]);  //取得成績
  if (score[i]>700000) score[i]=score[i]-700000;
 }
 
 for (i=0;i<num;i++) //從第一個開始, 依次跟每個比
 {
  min=i;
  for (j=i+1;j<num;j++)
  {
   if (score[min]>score[j])  //前面要比較小,取得最小值位址
   {
    min=j;
   }
  }
  temp = score[i];
  score[i]=score[min];
  score[min]=temp;
 }
 int sum[student]={0};
 for (i=0;i<num;i++)  //從第一個開始加,然後遞減 ,算出全部的和
 {
  for (j=num-i-1;j>=0;j--)
  {
     sum[i] = sum[i] +score[j];
    if (sum[i]>700000)
    {
     sum[i] = sum[i] - score[j];
   continue;
    }
     }
  //這裡ok  
 }
 
 //和來由小排到大 ]
 for (i=0;i<num;i++)
 {
  //printf ("%d\n",sum[i]);
  min=i;
  for (j=i+1;j<num;j++)
  {
   //printf("%d %d\n",sum[i],sum[j]);
   if (sum[min]>sum[j])
   {
           min=j;
          //printf ("%d %d %d\n",sum[i],sum[j],temp);
   }
   temp = sum[i];
   sum[i]=sum[min];
   sum[min]=temp;
  }
  //printf ("%d\n",sum[i]);
 }
 printf ("%d",sum[min]);//因為迴圈結束後,最後一個值就是最大的
 return 0;
}