NPSC補完計劃

登入註冊帳號.

請輸入帳號, 密碼以及預計登入時間
進階搜尋  

最新消息:

歡迎光臨NPSC補完計劃

+ NPSC補完計劃 » NPSC國中組 » NPSC2012國中組初賽
 F:小可魚兒游

作者 主題: F:小可魚兒游  (閱讀 1983 次)

austin0625

  • 新手
  • *
  • 文章數: 4
    • 檢視個人資料
F:小可魚兒游
« 於: 十一月 29, 2012, 08:00:25 pm »

這題在從左半邊游到右半邊或右半邊游到左半邊時再分開判斷就行了 :D
代碼: [選擇]
#include<iostream>

using namespace std;
int a(int x){
    return (x<0?-x:x);
}
int main(){
    int t=0;
    int n=0;
    int r=0,l=0;
    int fish=0;
    while(cin>>t){
                 for(int cnt=0;cnt<t;cnt++){
                         cin>>n;
                         int m[n];
                         for(int i=0;i<n;i++){
                                 cin>>m[i];
                                 }
                         for(int i=0;i<n;i++){
                                 if(m[i]>=0&&fish<=0){
                                            l+=(fish+m[i]>0?(-fish):m[i]);
                                            r+=(fish+m[i]>=0?m[i]+fish:0);
                                            fish+=m[i];
                                 }else if(m[i]>=0&&fish>=0){
                                       r+=m[i];
                                       fish+=m[i];
                                 }else if(m[i]<=0&&fish>=0){
                                       r+=(fish+m[i]<0?fish:(-m[i]));
                                       l+=(fish+m[i]<=0?-m[i]-fish:0);
                                       fish+=m[i];
                                 }else if(m[i]<=0&&fish<0){
                                       l+=(-m[i]);
                                       fish+=m[i];
                                 }
                                 }
                         cout<<(r>l?"Go right":(r==l?"Both okay":"Go left"))<<endl;
                         n=0;
                         r=l=0;
                         fish=0;
                         }
                 }
}
記錄

skipper

  • 初級會員
  • **
  • 文章數: 28
    • 檢視個人資料
Re: F:小可魚兒游
« 回覆 #1 於: 十二月 01, 2012, 08:38:11 pm »

(錯的!)似乎把數列加起來看總和是正或負或0就可以決定了。
代碼: [選擇]
#include <iostream>
#include <string>
using namespace std;
int main(void){
int T,M,N;
cin >> T;
for(int i = 0;i < T;i++){
cin >> N;
int j,sum=0;
for(j = 0;j < N;j++){
int current;
cin >> current;
sum+=current;
}
string msg;
if (sum>0){
msg = "Go right";
}
else if (sum<0){
msg = "Go left";
}
else{
msg = "Both okay";
}
cout << msg << endl;
}
system("pause");
return 0;
}
« 上次編輯: 十二月 09, 2012, 09:20:48 am 由 skipper »
記錄

austin0625

  • 新手
  • *
  • 文章數: 4
    • 檢視個人資料
Re: F:小可魚兒游
« 回覆 #2 於: 十二月 01, 2012, 09:43:43 pm »

這樣會有反例吧....
-1 -2 4
3 4 -8
這樣應該就過不了了
記錄

yuxin995

  • 新手
  • *
  • 文章數: 3
    • 檢視個人資料
Re: F:小可魚兒游
« 回覆 #3 於: 十二月 01, 2012, 10:39:22 pm »

@ skipper

你那個做法我在比賽的時候第一次就寫那樣,結果是 WA。後來有隊伍對題目的意思詢問,我才恍然大悟原來我理解錯誤。

這題是要求在左右邊停留的時間,如從 -2 到 5,則左半邊時間要 +2 ,右半邊時間要 +5。

附上的我的解法 (C)

代碼: [選擇]
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main(){
    int i,j,k,s,n,t;
    long int g,f[1001],l,r,tmp;
    scanf("%d",&n);
    while(n--){
       
        scanf("%d",&t);
        for(i=0;i<t;i++){
            scanf("%ld",&f[i]);
        }
        g = 0;l = 0; r = 0; tmp = 0;
        for(i=0;i<t;i++){
            g += f[i];
            if( g >= 0 && tmp >= 0 ){
                r+=abs(f[i]); }
            else if( g <= 0 && tmp <= 0){
                 l+=abs(f[i]); }
            else if( g < 0 && tmp > 0){ r+=tmp; l+=abs(g); }
            else if( g > 0 && tmp < 0){ r+=g; l+=abs(tmp); }
            tmp = g;
        }
       
        if( r > l ) printf("Go right\n");
        else if( r < l ) printf("Go left\n");
        else printf("Both okay\n");       
    }   
    return 0;   
}
記錄

skipper

  • 初級會員
  • **
  • 文章數: 28
    • 檢視個人資料
Re: F:小可魚兒游
« 回覆 #4 於: 十二月 09, 2012, 09:20:19 am »

謝謝! :)
記錄

WYJOIER

  • 訪客
Re: F:小可魚兒游
« 回覆 #5 於: 四月 23, 2014, 11:03:21 am »

附上我的解法~
代碼: [選擇]
#include <cstdio>
#define abs(a) (((a)<(0))?(-(a)):(a))
int main()
{
int T , N , M , P , Left , Right;
scanf("%d",&T);
while( T-- && scanf("%d",&N) )
{
P = Left = Right = 0;
while( N-- && scanf("%d",&M) )
{
if( M > 0 )
{
if( P + M >= 0 && P > 0 )Right += M , P += M;
else if( P + M >= 0 && P < 0 )Left += abs(P) , P += M , Right += P;
else if( P + M <= 0 && P < 0 )Left += M , P += M;
else if( P == 0 )Right += M , P += M;
}
else if( M < 0 )
{
if( P + M >= 0 && P > 0 )Right += abs(M) , P += M;
else if( P + M <= 0 && P < 0 )Left += abs(M) , P += M;
else if( P + M <= 0 && P > 0 )Right += P , P += M , Left += abs(P);
else if( P == 0 )Left += abs(M) , P += M;
}
}
if( Left == Right )printf("Both okay\n");
else if( Left > Right )printf("Go left\n");
else printf("Go right\n");
}
return 0;
}
記錄
+ NPSC補完計劃 » NPSC國中組 » NPSC2012國中組初賽
 F:小可魚兒游