2016-07-10 3 views
-4

StackOverFlowに関する私の最初の質問。
https://code.google.com/codejam/contest/11274486/dashboard#s=p0Googleコードジャム2017ラウンドA APAC国別リーダー

私のC++コードを終了し、正常にファイルを出力しました(私は思う)。しかし、ダッシュボードシステムが正しく反応しませんでした。なぜそれが起こったのかわかりません。
誰かが自分のアルゴリズムに何が間違っているのかを理解したり、解決したらコードを共有したりすることができます。ありがとう!!
そして私の貧しい英語を申し訳ありません。
これはXcodeの7.3.1と私のコードです:ハーゲン・フォン・Eitzenへ

// already solved the problem and removed my bad code :P 

おかげで、ここで
が正しいバージョンである:

#include <iostream> 
using namespace std; 

int letternum(string name) 
{ 
    int i,num = 0; 
    int count[26]; 
    for (i=0; i<26; i++) 
     count[i] = 0; 
    for (i=0; i<name.length(); i++) 
    { 
     if (name[i] != ' ') 
      count[name[i]-'A'] = 1; 
    } 
    for (i=0; i<26; i++) 
    { 
     num += count[i]; 
    } 
    return num; 
} 

int main() 
{ 
    int T,N,t,n; 
    int longlen,namelen; 
    char tempchar[21]; 
    string longest; 
    string name; 

    FILE *fin = fopen("A-large-practice.in", "r"); 
    FILE *fout = fopen("A-large-practice.out", "w"); 

    fscanf(fin, "%d", &T); 

    for (t=0; t<T; t++) 
    { 
     memset(tempchar, '\0', 21); 
     longest = ""; 
     name = ""; 
     fscanf(fin, "%d\n", &N); 
     fscanf(fin, "%[^\n]%*c", tempchar); 
     longest = tempchar; 
     longlen = letternum(longest); 

     for (n=1; n<N; n++) 
     { 
      memset(tempchar, '\0', 21); 
      name = ""; 
      fscanf(fin, "%[^\n]%*c", tempchar); 
      name = tempchar; 
      namelen = letternum(name); 
      if (longlen == namelen) 
      { 
       if (longest > name) 
       { 
        longest = name; 
        longlen = letternum(longest); 
       } 
      } 
      if (longlen < namelen) 
      { 
       longest = name; 
       longlen = letternum(longest); 
      } 
     } 
     fprintf(fout, "Case #%d: %s\n", t+1, longest.c_str()); 
    } 
} 
+5

実際にC++を使用すると、これはかなり簡単になります。 –

答えて

0

名前は最大20から構成されてもよいです文字。終了するNUL文字のスペースも予約する必要があります。そうでなければ、あなたのコード入力してもよいが、実際には20文字の長さである場合クラッシュ

letternum:パフォーマンス(ここではほとんど関連が):あなたは、常に必要以上に長くなることが最大の長さ20、まで数えます。また、配列全体をゼロにすることを忘れていないことは幸いです。 ++を最初のループの=1に置き換えた場合、2番目のループで合計する必要があります。

また、stringまたはstrcmpなどの標準を使用しないのはなぜですか。

+0

ありがとうございました!私は 'letternum'の長さを21に変更し、それは正しかった!また、すべてのchar []を文字列に変更します。しかし、文字列に入力するためにfscanfを使用する際に問題があります(私はそれが私の問題だと思います)ので、temp char []を追加します。限り、strcmpまで、私はそれを忘れてしまった... –

+0

@usako_lynnあなたはeadにしたいかもしれないhttp://stackoverflow.com/questions/5455802/how-to-read-a-complete-line-from-the-user- C++の使い方 –

0

これは、大小両方のデータセットでうまく機能します。

def word(a): 
''' this will find the total number of unique character in the name'''  
x=a.split()   
x="".join(x) 
x=list(x) 
x=set(x) 
x=list(x) 
return len(x) 

with open('A-large-practice.in','r') as f: 
    content = f.read().splitlines() 
fo=open('large_output.txt','r+') 
i=1 
p=0 
while i<len(content): 
x=int(content[i]) 
y=[] 
name=[] 
for j in range(1,x+1): 
    name.append(content[i+j]) 
    y.append(word(content[i+j])) 
z=[name[i] for i in range(len(y)) if y[i]==max(y)] 
z.sort() 
z=z[0] 
p=p+1 
fo.write('case #{}: {} \n'.format(p,z)) 
i=i+x+1 
fo.close()