【ABC164에 참가해 보았다】재택 근무가 되었기 때문에 매니지먼트계 SE가 경기 프로그래밍 시작해 보았다. #3 -해설-
10608 단어 C++신인 프로그래머 응원재택근무AtCoder경기 프로그래밍
마지막 기사
AtCoder164에 가입한 내 결과를보고했습니다.
이번에는 제가 실제로 해답할 수 있던 ABC 3가지 문제에 대해 해설하고 싶습니다.
【ABC164에 참가해 보았다】재택 근무가 되었기 때문에 매니지먼트계 SE가 경기 프로그래밍 시작해 보았다. #3
A문제: Sheep and Wolves
문제문 발췌
해설
두 개의 숫자를 비교하는 문제입니다.
양이 S마리, 늑대가 W마리 있는 경우에, 「늑대의 수가 양의 수 이상」 즉 「S<=W」가 되는 경우를 「unsafe」라고 합니다.
problemA.cpp#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
int s,w;
cin >> s >> w;
if(s<=w)
cout << "unsafe" << endl;
else
cout << "safe" << endl;
return 0;
}
B문제: 배틀
문제문 발췌
문제를 읽으면 이런 이미지가 솟아나는 걸까 생각합니다.
카드 게임이라든가는 아마 이미지를 할 수 있다고는 생각합니다만,
이미지할 수 없는 사람은 이런 흐름으로 몬스터의 싸움이 반복됩니다.
싸움의 이미지
그림을 보신 분은 흐름을 이해할 수 있었습니까?
그림에 기재한 대로 자쿠토 이런 흐름입니다.
1. 타카하시군의 몬스터가 아오키군의 몬스터에 공격해, 체력을 줄인다(C-B)
2. 아오키군의 몬스터가 타카하시군의 몬스터에 공격해 체력을 줄인다(A-D)
3. 이 조작을 어느 쪽의 몬스터의 체력(A 혹은 C)이 제로가 될 때까지 반복한다
4. 반복한 결과, 타카하시군이 이긴 경우(즉 C가 제로가 된 경우)는 Yes를, 그렇지 않으면 No를 출력한다
problemB.cpp#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
int a,b,c,d ;
cin >> a >> b >> c >> d;
while(a>=0 || c>=0){ //それぞれのモンスターの体力がゼロになるまで
c = c-b; //高橋君の攻撃のターン
if(c<=0){
cout << "Yes" << endl;
break; //勝敗が決まったのでループを抜ける
}
a = a-d; //青木君の攻撃のターン
if(a<=0){
cout << "No" << endl;
break; //勝敗が決まったのでループを抜ける
}
}
return 0;
}
C문제 : 가차
문제문 발췌
C문제에 대해서는 매번 문자열을 모든 검색에서 매칭하면 계산량의 관계로 실행시간 에러가 되는 것 같습니다.
따라서 아래와 같이 정렬 등으로 계산량을 줄이는 궁리가 필요합니다.
계산량에 대해서는 나도 어디까지라면 줄이면 좋다든가 정직 아직 이해할 수 없기 때문에,
자세한 설명은 삼가합니다.
※덧붙여서 나는 계산량이라든지 그다지 신경쓰지 않고, 이쪽이 간단하다-라고 생각하면 결과 잘 간 느낌이었습니다. . . 공부합니다.
problemC.cpp#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(int argc, const char * argv[]) {
int n;
cin >> n;
string a[n+1];
a[0] ="";
for(int i=1; i<=n; i++)
cin >> a[i];
sort(a,a+n+1); //配列の内容をソートして辞書順にする
int cnt=0;
for(int i=1; i<=n; i++){
if(a[i-1]==a[i]) //同じものの場合にcntをインクリメントする
cnt++;
}
cout << n-cnt << endl; //違うものの数を数えたいのでnからcntを引く
return 0;
}
마지막으로
어땠습니까?
봐도 모르겠다고 좀 더 이렇게 하면 좋지 않을까? 같은 따뜻한 말 두시도시 기다리고 있습니다.
Reference
이 문제에 관하여(【ABC164에 참가해 보았다】재택 근무가 되었기 때문에 매니지먼트계 SE가 경기 프로그래밍 시작해 보았다. #3 -해설-), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/makom/items/dff9a4e64fb7566c117c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
문제문 발췌
해설
두 개의 숫자를 비교하는 문제입니다.
양이 S마리, 늑대가 W마리 있는 경우에, 「늑대의 수가 양의 수 이상」 즉 「S<=W」가 되는 경우를 「unsafe」라고 합니다.
problemA.cpp
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
int s,w;
cin >> s >> w;
if(s<=w)
cout << "unsafe" << endl;
else
cout << "safe" << endl;
return 0;
}
B문제: 배틀
문제문 발췌
문제를 읽으면 이런 이미지가 솟아나는 걸까 생각합니다.
카드 게임이라든가는 아마 이미지를 할 수 있다고는 생각합니다만,
이미지할 수 없는 사람은 이런 흐름으로 몬스터의 싸움이 반복됩니다.
싸움의 이미지
그림을 보신 분은 흐름을 이해할 수 있었습니까?
그림에 기재한 대로 자쿠토 이런 흐름입니다.
1. 타카하시군의 몬스터가 아오키군의 몬스터에 공격해, 체력을 줄인다(C-B)
2. 아오키군의 몬스터가 타카하시군의 몬스터에 공격해 체력을 줄인다(A-D)
3. 이 조작을 어느 쪽의 몬스터의 체력(A 혹은 C)이 제로가 될 때까지 반복한다
4. 반복한 결과, 타카하시군이 이긴 경우(즉 C가 제로가 된 경우)는 Yes를, 그렇지 않으면 No를 출력한다
problemB.cpp#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
int a,b,c,d ;
cin >> a >> b >> c >> d;
while(a>=0 || c>=0){ //それぞれのモンスターの体力がゼロになるまで
c = c-b; //高橋君の攻撃のターン
if(c<=0){
cout << "Yes" << endl;
break; //勝敗が決まったのでループを抜ける
}
a = a-d; //青木君の攻撃のターン
if(a<=0){
cout << "No" << endl;
break; //勝敗が決まったのでループを抜ける
}
}
return 0;
}
C문제 : 가차
문제문 발췌
C문제에 대해서는 매번 문자열을 모든 검색에서 매칭하면 계산량의 관계로 실행시간 에러가 되는 것 같습니다.
따라서 아래와 같이 정렬 등으로 계산량을 줄이는 궁리가 필요합니다.
계산량에 대해서는 나도 어디까지라면 줄이면 좋다든가 정직 아직 이해할 수 없기 때문에,
자세한 설명은 삼가합니다.
※덧붙여서 나는 계산량이라든지 그다지 신경쓰지 않고, 이쪽이 간단하다-라고 생각하면 결과 잘 간 느낌이었습니다. . . 공부합니다.
problemC.cpp#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(int argc, const char * argv[]) {
int n;
cin >> n;
string a[n+1];
a[0] ="";
for(int i=1; i<=n; i++)
cin >> a[i];
sort(a,a+n+1); //配列の内容をソートして辞書順にする
int cnt=0;
for(int i=1; i<=n; i++){
if(a[i-1]==a[i]) //同じものの場合にcntをインクリメントする
cnt++;
}
cout << n-cnt << endl; //違うものの数を数えたいのでnからcntを引く
return 0;
}
마지막으로
어땠습니까?
봐도 모르겠다고 좀 더 이렇게 하면 좋지 않을까? 같은 따뜻한 말 두시도시 기다리고 있습니다.
Reference
이 문제에 관하여(【ABC164에 참가해 보았다】재택 근무가 되었기 때문에 매니지먼트계 SE가 경기 프로그래밍 시작해 보았다. #3 -해설-), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/makom/items/dff9a4e64fb7566c117c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
int a,b,c,d ;
cin >> a >> b >> c >> d;
while(a>=0 || c>=0){ //それぞれのモンスターの体力がゼロになるまで
c = c-b; //高橋君の攻撃のターン
if(c<=0){
cout << "Yes" << endl;
break; //勝敗が決まったのでループを抜ける
}
a = a-d; //青木君の攻撃のターン
if(a<=0){
cout << "No" << endl;
break; //勝敗が決まったのでループを抜ける
}
}
return 0;
}
문제문 발췌
C문제에 대해서는 매번 문자열을 모든 검색에서 매칭하면 계산량의 관계로 실행시간 에러가 되는 것 같습니다.
따라서 아래와 같이 정렬 등으로 계산량을 줄이는 궁리가 필요합니다.
계산량에 대해서는 나도 어디까지라면 줄이면 좋다든가 정직 아직 이해할 수 없기 때문에,
자세한 설명은 삼가합니다.
※덧붙여서 나는 계산량이라든지 그다지 신경쓰지 않고, 이쪽이 간단하다-라고 생각하면 결과 잘 간 느낌이었습니다. . . 공부합니다.
problemC.cpp
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
int main(int argc, const char * argv[]) {
int n;
cin >> n;
string a[n+1];
a[0] ="";
for(int i=1; i<=n; i++)
cin >> a[i];
sort(a,a+n+1); //配列の内容をソートして辞書順にする
int cnt=0;
for(int i=1; i<=n; i++){
if(a[i-1]==a[i]) //同じものの場合にcntをインクリメントする
cnt++;
}
cout << n-cnt << endl; //違うものの数を数えたいのでnからcntを引く
return 0;
}
마지막으로
어땠습니까?
봐도 모르겠다고 좀 더 이렇게 하면 좋지 않을까? 같은 따뜻한 말 두시도시 기다리고 있습니다.
Reference
이 문제에 관하여(【ABC164에 참가해 보았다】재택 근무가 되었기 때문에 매니지먼트계 SE가 경기 프로그래밍 시작해 보았다. #3 -해설-), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/makom/items/dff9a4e64fb7566c117c
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(【ABC164에 참가해 보았다】재택 근무가 되었기 때문에 매니지먼트계 SE가 경기 프로그래밍 시작해 보았다. #3 -해설-), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/makom/items/dff9a4e64fb7566c117c텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)