大傢好,我剛學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;
}
是針對題目B568,不小心貼到這了
3
699999 699998 2
這筆輸入你的程式就錯誤了
這題實際上要用 Dynamic Programming 求解
才剛開始學 C 不建議解這題,不過如果有興趣可以自己 Google
3
699999 699998 2
這筆輸入你的程式就錯誤了
這題實際上要用 Dynamic Programming 求解
才剛開始學 C 不建議解這題,不過如果有興趣可以自己 Google
謝謝你
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;
}