奇安信筆記試験8.16(最初の問題はプラットフォームに問題がありますか?)

12137 ワード

ボーナスを出す
これは本当にプラットフォームが悪いですね.テーマ自体はとても簡単で、簡単なダイナミックな計画で、法則を簡単に見ることができます.結果は2 n-1 2^{n-1}2 n-1で、nはボーナスです.
#include 
int func(int num_money)
{
	if (num_money <= 0) return 0;
	if (num_money==1 || num_money==2) return num_money; 
	return static_cast<int>(pow(2, num_money-1));
}

コードは間違いないと思いますが、0点..入力の問題なのか何なのかわかりませんが、とにかく迷っています.
取り消し操作、hello undo redo world
筆記試験の時は緊張して、いつも入力が間違っています.while(cin>>str)は文字列タイプにとって、これはデッドサイクルで、停止しません.int、doubleなどのタイプだけが読み取りに失敗してループを終了します.私はその時入力をうまく処理しなかったが、最後に40%しか使用例を過ぎなかった...
地元で考え直しました考え方は、まずgetlineで1行の文字列を直接読み込むことです.(cinが1つずつ読み取ってデッドサイクルになることは避けた)、それを自分で複数の単語に分割してからvectorのerase関数をそのまま利用して対応削除すればいいのですが、筆記試験プラットフォームの完全なテスト用例がないので、このコードがどれだけの用例ができるか分かりません.基本的な正常な入力は問題ありません.考え方もまだはっきりしています.
ただしvectorのerase関数が実行されると、反復器が指す位置は、その前に位置を指す次の位置であり、実際に削除された位置の次の位置ではありません.例えば、v.erase(it-1)後にitが指すのは、元のitの次の位置であり、it-1の次の位置ではありません.
#include 
using namespace std;
void split(const string & s, vector<string> & vs)
{
    string tmp = "";
    int n = s.size();
    for (int i=0;i<n;)
    {
        while (i < n && s[i]==' ') ++i;//  s[i]        
        while (i < n && s[i]!=' ')
        {
            tmp += s[i];
            ++i;
        }
        vs.emplace_back(tmp);
        tmp = "";
        while (i < n && s[i]==' ') ++i;
    }
}
int main() {
    string s;
    getline(cin, s);
    vector<string> res;
    split(s, res);
    for (auto it=res.begin();it!=res.end();)
    {
        if (*it == "undo" && *(it+1)!="redo")
        {
            res.erase(it-1);//      it-1     , it                   
            res.erase(it-1);//      1
            --it;//       1,          
        }
        else if (*it == "undo" && *(it+1)=="redo")
        {
            res.erase(it);//      it  erase   ,it             
            res.erase(it);
        }
        else
            ++it;
    }
    //  
    int i;
    for (i=0;i<res.size()-1;++i)
        cout << res[i] << ' ';
    cout << res[i];
    return 0;
}