2020バイトジャンプ筆記試験問題


第一題
明ちゃんはいつも寝坊しているので、目覚まし時計をたくさん予約しました.目覚まし時計が鳴ったときだけ目が覚めて起きないことにしました.起きてからX分で教室に着きます.授業時間は当日のA時B分です.遅くてもいつ起きられますか.説明を入力:最初の動作は正の整数で、目覚まし時計の数N(N<=100)を表す次のN行は行ごとに2つの整数で、この目覚まし時計が鳴る時間がHiの時Mi分であることを表す次の行は1つの整数を含んで、起きてから彼がXを必要とすることを表す(0<=X<=100)分で教室に到着する次の行には2つの整数が含まれており、授業時間がAの場合B分であることを示すデータは、少なくとも1つの目覚まし時計が牛を教室にタイムリーに到着させることを保証する.出力説明:出力2つの整数は牛が最も遅く起きる時間を示す例1:入力3 5 0 6 0 7 0 59出力6
ぶんせき
比较的简単で、私は(时间*60+分+教室に着くのに必要な时间X)を时间として比较して、授业の时间との差が最も小さいのが答えです.
コード#コード#
#include
#include
#include
#include
#include
using namespace std;
#define INF 0x3f3f3f3f
typedef long long LL;

int n,x;
int a[110],b[110];
int h,m;
int main()
{
    cin>>n;
    for (int i=1 ; i<=n ; i++){
        cin>>a[i]>>b[i];
    }
    cin>>x;
    cin>>h>>m;
    int mintime=INF,ans;
    for (int i=1 ; i<=n ; i++){
        int now = 60*h+m - (60*a[i]+b[i]+x);
        if (now >= 0 && now < mintime){
            mintime = now;
            ans = i;
        }
    }
    cout<<a[ans]<<" "<<b[ans]<<endl;
    return 0;
}


第二題
明ちゃんとアンジーは親友で、最近、彼らの話は探偵機関に監視されているので、彼らの話の内容を暗号化して処理したいと思っていました.そこで、彼らは新しい暗号化方法を発明しました.各情報はバイナリBにコンパイルされる(明文)、長さN、その後、この情報はK回書かれ、0、1、・・・、K−1ビットずつ右に移動する.例えば、B=1001010 K=4 1001010 1001010 1001010 1001010 1001010は、各列に対して排他的または操作を行い、最終結果を暗号Sとして記録し、例えば上記の例の結果が1110100110である最後に、符号化された情報SおよびKを送信するアンジーアンジーに復号化プロセスを実現するためにコードが必要です.彼女を助けることができますか?入力説明:第1行入力2個の整数NとK第2行入力1個のバイナリ文字列S、長さN+K-1出力説明:出力明文B例1:入力7 4 1110100110出力1001010例2:入力6 2 1110001出力101111
ぶんせき
簡単にシミュレーションすると、明らかに最初の位置の数が結果の第1位であり、第2の位置の数異または結果の第1位は結果の第2位に等しい.この原理は異または操作が可逆的であるため、法則を観察する.この例では、結果の第3位は与えられた数の上位3位異または得であり、結果の第4位は与えられた数の上位4位異または得である.結果第5位は与えられた数の第2位から第5位までの異和から得られたので、私はnowを使って現在の数字を保存しました.iがまだkに達していない場合は、現在の数をnowと異和すればいいだけです.iがkより大きい場合、nowは現在の数と異和であり、結果の第i-k位と異和であることを保証することができます.そうすれば、nowがk個の数異和から来ていることを保証することができます.話せば話すほど混乱して、少し回りくどいので、自分で法則を探して書いたほうがいいです.
コード#コード#
#include
#include
#include
#include
#include
#include
using namespace std;
#define INF 0x3f3f3f3f
typedef long long LL;

int n,k;
string ss;
int ans[1000];
int main()
{
    cin>>n>>k;
    cin>>ss;
    ans[0] = ss[0]-'0';
    int now = ans[0];
    for (int i=1 ; i<n ; i++){
        ans[i] = now ^ (ss[i]-'0');
        now ^= ans[i];
        if (i >= k-1) now ^=  ans[i-k+1];
    }
    for (int i=0 ; i<n ; i++)
        cout<<ans[i];
    cout<<endl;
    return 0;
}

第三題
私は王大ハンマーと申します.インターネット会社の社長です.もうすぐ年末になって、従业员にボーナスを出して、本当に头が痛くて、大きい环境はこんなに悪くて、どのようにできるだけ少なく出すことができて、同时にまたみんなに恨みを少なくすることができますか?会社の席は一列に並んでいて、一人一人が一番多く自分と隣の左右の席の同僚のボーナスを聞いて、私はこのように出すことにしました:一人一人が少なくとも100元を出す;年功序列については、一人一人の入社年限が公開されています.もし一人の従業員Aが隣の同僚Bより早く入社したら、Aは少なくともBより100元多く持って、古い従業員の心理的なバランスを取ることができます.私は本当に天才ですね.人間性をこんなに徹底的に理解して、小さな会社のボスになるのは本当に屈才だ.ハンマー会社の従業員の座席表と、従業員一人一人の入社時間を与えて、ハンマーが最低いくらボーナスを出すかを計算します.入力説明:1行目に1つの整数Nのみ(1<=N<=1000)があり、従業員数を表します.2行目にはN個の正の整数があり、各従業員の入社年限を表し、従業員の座席順に並べられています.出力説明:1個の数字で、ハンマーが最も少ないボーナス数を表します.例1:入力4 3 9 2 7出力600
例2:入力3 1 1 1出力300
例3:入力5 1 2 3 4 5出力1500
分析(この分析に問題がある)
貪欲で、初めの時最小ボーナスは100元で、それでは第1人は先に最小ボーナスに100元をあげて、iは2からnまで遍歴して、もし第i人の勤続年数が第i-1人の長さより長いならば、第i人のボーナスは第i-1人のボーナスに100をプラスして、もし同じ勤続年数ならば、それでは同じボーナスで、第i人の勤続年数がもっと短いならば、それでは彼に最小ボーナスを支給するだけでいいですただし、i-1人目が最小ボーナスを出した場合、i人目が最小ボーナスよりも100少ないボーナスを出すことができる場合は、最小ボーナスを更新して遍歴し続ける必要があることに注意してください.この場合、最小ボーナスはマイナスになる可能性がありますので、全員のボーナスに(100-最小ボーナス)を加算する必要があります.このようにボーナスが最も少ない人は100を取得します.例えば、勤続年数が5 4 3 6で最初の人は100を、最小ボーナスは100を、2番目の人は0を、最小ボーナスは0を、3番目の人は-100を、最小ボーナスは-100を、4番目の人は0を、このとき最小ボーナスは-100を加算すると、誰もが(100-(−100)=200、すなわち300,200,100,200.
コード#コード#
#include
using namespace std;
#define INF 0x3f3f3f3f
typedef long long LL;

int n,ans;
int years[1100],reward[1100];

int main()
{
    cin>>n;
    for (int i=1 ; i<=n ; i++)
        cin>>years[i];
    reward[1] = 100;
    int minn = 100;
    ans = 100;
    for (int i=2 ; i<=n ; i++){
        if (years[i] > years[i-1])
            reward[i] = reward[i-1] + 100;
        else if (years[i] == years[i-1])
             reward[i] = reward[i-1];
        else if (years[i] < years[i-1]){
            reward[i] = min(minn,reward[i-1]-100);
            minn = min(minn,reward[i]);
        }

        ans += reward[i];
    }
    cout<<ans+(100-minn)*n<<endl;
    return 0;
}


このブログが発表されてから半年が経ちましたが、私は力ボタンの似たような問題をしていたとき、突然このやり方に問題があることに気づきました.例えば、1 4 3 2、私のアルゴリズムは100 200、100、100の結果を出して、それから最小値を100に補うために300、400、300、200、100になりました.明らかに最適な結果ではありません.この問題は確かに欲張りですが、私の考えではありません.正しいやり方では、2つのreward配列を使用することができ、1つ目は左から右へ、1つ目は100を与え、i番目がi番目の人よりも勤続年数が長い場合はreward 1[i-1]+100、そうでない場合はreward 1[i]=100を与え、右から左へ、n番目の人は100を与え、i番目の人がi+1番目の人よりも勤続年数が長い場合はreward 2[i]=reward 2[i+1]+100を与え、そうでない場合は100を与える.最後にsum+=max(reward 1[i],reward 2[i])をいくつか巡って、ボーナスが隣接する大きさの関係を満たすことを保証します.具体的な方法はleetcode問題庫135を参照してキャンディを配布します.もしこの誤った考えがあなたに迷惑をかけたら、申し訳ありません.私はよく考えていません.
第四題
明ちゃんはランニングの练习をして、彼の家の近くの街は木で、この木の上の点は1からn番を押して、任意の2时の间は互いに达することができて、しかも1本の道があって、すべての道の距离はすべて1で、木の上で1本の道を探して走る必要があって、明ちゃんは3に対してとても兴味を持って、だから彼はすべての滑走路の距离と%3=0を知りたいと思って、1、2の道の総长は全部でそれぞれどれだけ长いですか、すなわち、ツリー上の任意の2点間距離%3=Kの距離和である.入力記述:1行目1 n、点数n<=1 e 5次n-1行毎u、vは無方向エッジ出力記述を表す:1行3個の整数、それぞれ%3=0、1、2の2点距離の距離和を表し、結果モデリング1 e 9+7例1:入力3 1 2 2出力0 2 2
この樹論はできないので、難しいと思います.