Study/PS
20230805 업다운 랜디
피준
2023. 8. 5. 20:19
s#100.. !solved_by:p_jun *g5
30분 3문제
G5 16925 문자열 추측 + 22분 19초
내가 너무 싫어하는 구현, 문자열 문제
접미사와 접두사 S, P 인걸 반대로 출력해 시간을 너무 날렸다
맞왜틀로 시간만 태웠다
그냥 나온대로 구현하면 된다
더보기
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <deque>
#include<set>
#include<map>
#include<cassert>
using namespace std;
using ll = long long;
#define MOD 1000000007
const ll INF = 987654321;
const int MX = 500005;
int n;
vector<pair<string, int>> v;
int is_p(string a, string b) {
for (int i = 0; i < a.length(); i++) {
if (b[i] != a[i]) return 0;
}
return 1;
}
int is_s(string a, string b) {
for (int i = 0; i < a.length(); i++) {
if (b[b.length() - i - 1] != a[a.length() - i - 1]) return 0;
}
return 1;
}
void sol(string s) {
string ans = "";
ans.resize(n * 2 - 2);
for (int i = 0; i < n * 2 - 2; i += 2) {
if (is_p(v[i].first, s) && is_s(v[i + 1].first, s)) {
ans[v[i].second] = 'P';
ans[v[i + 1].second] = 'S';
}
else if (is_s(v[i].first, s) && is_p(v[i + 1].first, s)) {
ans[v[i].second] = 'S';
ans[v[i + 1].second] = 'P';
}
else return;
}
cout << s << '\n';
cout << ans << '\n';
exit(0);
}
bool cmp(pair<string, int>& a, pair<string, int>& b) {
return a.first.length() < b.first.length();
}
int main() {
ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
cin >> n;
v.resize(n * 2 - 2);
for (int i = 0; i < n * 2 - 2; i++) {
cin >> v[i].first;
v[i].second = i;
}
sort(v.begin(), v.end(), cmp);
string tmp1 = v[2 * n - 3].first, tmp2 = v[2 * n - 4].first;
string str1 = tmp1 + tmp2.back(), str2 = tmp2 + tmp1.back();
sol(str1);
sol(str2);
}
S1 20167 꿈틀꿈틀 호석 애벌레 - 기능성 -12분 22초
그냥 문제 지문이 뭔가 이상하다
다 소화시키면 연속으로 못 먹는 줄 알고 시간을 날렸다
구현 좀 더 이쁘게 가능할거 같은데 귀찮으니 패스
더보기
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <deque>
#include<set>
#include<map>
#include<cassert>
using namespace std;
using ll = long long;
#define MOD 1000000007
const ll INF = 987654321;
const int MX = 500005;
int n, k;
vector<int> v;
int sol(int pos, int b, int f) {
if (pos == n) return max(0, b - k);
if (f == 1) {
b += v[pos];
if (b >= k)
return b - k + sol(pos + 1, 0, 2);
return sol(pos + 1, b, 1);
}
int ret = 0;
if (v[pos] >= k) return max(sol(pos + 1, 0, 0) + v[pos] - k, sol(pos + 1, b, 0));
return max(sol(pos + 1, b + v[pos], 1), sol(pos + 1, b, 0));
}
int main() {
ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
cin >> n >> k;
v.resize(n);
for (int i = 0; i < n; i++) cin >> v[i];
cout << sol(0, 0, 0) << '\n';
}
G5 9011 순서 -21분 27초
그냥 보고 이거네 하고 풀었다
더보기
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <vector>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <deque>
#include<set>
#include<map>
#include<cassert>
using namespace std;
using ll = long long;
#define MOD 1000000007
const ll INF = 987654321;
const int MX = 500005;
void sol() {
int n; cin >> n;
vector<int> v(n);
vector<int> p(n + 1);
for (int i = 0; i < n; i++) cin >> v[i];
reverse(v.begin(), v.end());
vector<int> ans(n);
for (int i = 0; i < n; i++) {
int cnt = 0;
int num = 0;
for (int j = 0; j < n; j++) {
if (cnt == v[i]) {
for (int k = j; k < n; k++) {
if (p[k + 1]) continue;
num = k + 1;
break;
}
break;
}
if (!p[j + 1]) cnt++;
}
p[num] = 1;
if (!num) {
cout << "IMPOSSIBLE" << '\n';
return;
}
ans[n - 1 - i] = num;
}
for (int i = 0; i < n; i++) cout << ans[i] << " ";
cout << '\n';
}
int main() {
ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);
int tc; cin >> tc;
while (tc--) sol();
}