奇安信筆記試験8.16(最初の問題はプラットフォームに問題がありますか?)
12137 ワード
ボーナスを出す
これは本当にプラットフォームが悪いですね.テーマ自体はとても簡単で、簡単なダイナミックな計画で、法則を簡単に見ることができます.結果は2 n-1 2^{n-1}2 n-1で、nはボーナスです.
コードは間違いないと思いますが、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の次の位置ではありません.
これは本当にプラットフォームが悪いですね.テーマ自体はとても簡単で、簡単なダイナミックな計画で、法則を簡単に見ることができます.結果は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;
}