美団2018はプログラミングの問題を測定します——答案を直します&魔法の時計
5418 ワード
魔法の時計
時間制限:C/C++言語2000 MS;その他言語4000 MSメモリ制限:C/C++言語65536 KB;时は娘の凛に魔法时计をプレゼントしたが、魔法时计の针はいつも変なところを指しているので、凛はこの时计を修理することにした.現在のテーブルのポインタは、方向n 1(0度から359度の間、正北方向は0度、正東方向は90度)を指し、彼女は針を方向n 2に調整する必要がある.時計針を時計回りに回転させるか、時計針を反時計回りに回転させるかを選択することができ、時計回りに回転すると角度が大きくなり、反時計回りに回転すると角度が小さくなります.時計回りに359度まで回転すると、もう一度回転すると0度に戻ります.凛は時計の針の回転角度をできるだけ小さくしたいと思っています.つまり、最短経路で正しい方向に回転させるには、どのように回転すべきか教えてください.複数の回転方法で正しい方向に回転することができ、回転した角度が同じである場合、凛は時計回りに回転することを選択します.入力第1行は、針の現在の方向を表す整数n 1を含む.2行目は、針が指すべき正しい方向を示す整数n 2を含む.0≦n 1,n 2≦359出力時計回りにx度回転する必要がある場合はxを出力する.x度を反時計回りに回転させる必要がある場合は、$-xを出力します.
サンプル入力Input Sample 1 315 45 Input Sample 2 45 270サンプル出力Output Sample 1 90 Output Sample 2-135*
答案用紙を改める
時間制限:C/C++言語2000 MS;その他言語4000 MSメモリ制限:C/C++言語65536 KB;小学校の时、私达はよくこのような事に出会った:试験が终わった后に先生は试験用紙を直すのがおっくうで、そこで私达に机とお互いに答案用紙を交换してから相手のために添削します.しかし、その後、先生はカンニングが起こりやすいことに気づいて、新しい方法を考えました.先生は同級生をnつのグループに分け、そのうちi番のグループにはsi人がいます.そして先生はある順番でこれらのグループを訪問します.彼が訪問した最初のグループに対して、彼はこのグループ内のすべての答案用紙をテーブルの上に置いた.彼が後続して訪問した各グループについては、まず机の上の答案用紙の一番上からそのグループの人数に対応する答案用紙を取り出し、ランダムにグループの一人一人に1枚の答案用紙を割り当てて批改させ、その後、このグループの学生が自分で試験した答案用紙をデスクトップの答案用紙の一番下に置いた.彼がすべてのグループにアクセスした後、デスクトップの残りのすべての試験用紙を最初にアクセスしたグループの学生にランダムに割り当ててバッチします.しかし、彼はこの方法にも問題があることを発見しました.途中であるグループにアクセスしたとき、デスクトップの答案用紙がこのグループの学生に1枚ずつ割り当てられていない可能性があります.最終的には、自分の答案用紙を添削する学生が割り当てられ、この2つの状況が各グループにアクセスする順序に関係しているかどうかもしれません.今、彼は1つの訪問順序が以上の2つの状況を現れず、試験用紙の改訂を順調に完成させることができるかどうかを知りたいと思っています.学生グループ数を表す最初の整数nを入力します.2≦n≦30の2行目はn個の整数、s 1、s 2、...、snは、それぞれ各グループの学生の人数を表す.1≦si≦10000出力1つのアクセス順序があれば、試験用紙を順調にバッチして完成させ、Yesを出力し、そうでなければ出力No.
サンプル入力Input Sample 1 2 10 20 Input Sample 2 4 2 3 1サンプル出力Output Sample 1 No Input Sample 2 Yes
Hintは2組目のサンプルに対して,先訪問人数が3のグループ,再訪問人数が3のグループ,再訪問人数が1のグループ,最後訪問人数が2のグループを選択できる.
時間制限:C/C++言語2000 MS;その他言語4000 MSメモリ制限:C/C++言語65536 KB;时は娘の凛に魔法时计をプレゼントしたが、魔法时计の针はいつも変なところを指しているので、凛はこの时计を修理することにした.現在のテーブルのポインタは、方向n 1(0度から359度の間、正北方向は0度、正東方向は90度)を指し、彼女は針を方向n 2に調整する必要がある.時計針を時計回りに回転させるか、時計針を反時計回りに回転させるかを選択することができ、時計回りに回転すると角度が大きくなり、反時計回りに回転すると角度が小さくなります.時計回りに359度まで回転すると、もう一度回転すると0度に戻ります.凛は時計の針の回転角度をできるだけ小さくしたいと思っています.つまり、最短経路で正しい方向に回転させるには、どのように回転すべきか教えてください.複数の回転方法で正しい方向に回転することができ、回転した角度が同じである場合、凛は時計回りに回転することを選択します.入力第1行は、針の現在の方向を表す整数n 1を含む.2行目は、針が指すべき正しい方向を示す整数n 2を含む.0≦n 1,n 2≦359出力時計回りにx度回転する必要がある場合はxを出力する.x度を反時計回りに回転させる必要がある場合は、$-xを出力します.
サンプル入力Input Sample 1 315 45 Input Sample 2 45 270サンプル出力Output Sample 1 90 Output Sample 2-135*
#include
#include
using namespace std;
int main(){
int n1, n2;
while (cin >> n1){
cin >> n2;
int tmp1 = 0, tmp2 = 0;
int res = 0;
if (n1 > n2){
tmp1 = 360 - (n1 - n2);
tmp2 = n1 - n2;
if (tmp1 > tmp2)
res = -tmp2;
else
res = tmp1;
}
else{
tmp1 = n2 - n1;
tmp2 = n1 + 360 - n2;
if (tmp1>tmp2)
res = -tmp2;
else
res = tmp1;
}
cout << res << endl;
}
system("pause");
return 0;
}
答案用紙を改める
時間制限:C/C++言語2000 MS;その他言語4000 MSメモリ制限:C/C++言語65536 KB;小学校の时、私达はよくこのような事に出会った:试験が终わった后に先生は试験用紙を直すのがおっくうで、そこで私达に机とお互いに答案用紙を交换してから相手のために添削します.しかし、その後、先生はカンニングが起こりやすいことに気づいて、新しい方法を考えました.先生は同級生をnつのグループに分け、そのうちi番のグループにはsi人がいます.そして先生はある順番でこれらのグループを訪問します.彼が訪問した最初のグループに対して、彼はこのグループ内のすべての答案用紙をテーブルの上に置いた.彼が後続して訪問した各グループについては、まず机の上の答案用紙の一番上からそのグループの人数に対応する答案用紙を取り出し、ランダムにグループの一人一人に1枚の答案用紙を割り当てて批改させ、その後、このグループの学生が自分で試験した答案用紙をデスクトップの答案用紙の一番下に置いた.彼がすべてのグループにアクセスした後、デスクトップの残りのすべての試験用紙を最初にアクセスしたグループの学生にランダムに割り当ててバッチします.しかし、彼はこの方法にも問題があることを発見しました.途中であるグループにアクセスしたとき、デスクトップの答案用紙がこのグループの学生に1枚ずつ割り当てられていない可能性があります.最終的には、自分の答案用紙を添削する学生が割り当てられ、この2つの状況が各グループにアクセスする順序に関係しているかどうかもしれません.今、彼は1つの訪問順序が以上の2つの状況を現れず、試験用紙の改訂を順調に完成させることができるかどうかを知りたいと思っています.学生グループ数を表す最初の整数nを入力します.2≦n≦30の2行目はn個の整数、s 1、s 2、...、snは、それぞれ各グループの学生の人数を表す.1≦si≦10000出力1つのアクセス順序があれば、試験用紙を順調にバッチして完成させ、Yesを出力し、そうでなければ出力No.
サンプル入力Input Sample 1 2 10 20 Input Sample 2 4 2 3 1サンプル出力Output Sample 1 No Input Sample 2 Yes
Hintは2組目のサンプルに対して,先訪問人数が3のグループ,再訪問人数が3のグループ,再訪問人数が1のグループ,最後訪問人数が2のグループを選択できる.
#include
#include
#include
#include
using namespace std;
string res[2] = { "Yes", "No" };
int main()
{
int n;
while (cin >> n){
vector<int> s(n);
for (int i = 0; i < n; i++)
cin >> s[i];
sort(s.begin(), s.end());
reverse(s.begin(), s.end());
int first = s[0];
int tmp = 0;
for (int i = 1; i < n; i++)
tmp = tmp + s[i];
if (first>tmp)
cout << res[1];
else
cout << res[0];
}
system("pause");
return 0;
}