기술나눔

코드포스 957라운드(3부)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

A. 장점만

 has three integers 𝑎, 𝑏 and 𝑐 ,has to give Noobish_Monk 𝑎×𝑏×𝑐 bananas.these integers and decided to do the following at most 5 times

이 정수 중 하나를 고르세요

1만큼 늘리다

For example, if 𝑎=2, 𝑏=3 and 𝑐=4, then one can increase 𝑎 three times by one and increase 𝑏 two times. After that 𝑎=5, 𝑏=5, 𝑐=4. Then the total number of bananas will be 5×5×4=100.

the maximum value of 𝑎×𝑏×𝑐 

탐욕스럽게 생각하면 가장 작은 숫자 +1을 찾을 때마다 데이터 범위가 매우 작고 직접적으로 폭력적입니다.

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define i64 long long
  4. void solve(){
  5. vector<int> a(3);
  6. for(int i = 0; i < 3; i ++) cin >> a[i];
  7. for(int i = 0; i < 5; i ++){
  8. sort(a.begin(), a.end());
  9. a[0] ++;
  10. }
  11. cout << (i64)a[0] * a[1] * a[2] << "n";
  12. }
  13. int main(){
  14. ios::sync_with_stdio(false);
  15. cin.tie(0);
  16. int T;
  17. cin >> T;
  18. while(T--)
  19. solve();
  20. return 0;
  21. }

B. 화난 스님

 k1o0n has baked an enormous 𝑛 metres long potato casserole. He has cut it into 𝑘 pieces, of lengths 𝑎1,𝑎2,…,𝑎𝑘 meters.k1o0n wasn't keen on that.

  • Pick a piece with length 𝑎𝑖≥2 and divide it into two pieces with lengths 1 and 𝑎𝑖−1. As a result, the number of pieces will increase by 1;
  • Pick a slice 𝑎𝑖 and another slice with length 𝑎𝑗=1 (𝑖≠𝑗) and merge them into one piece with length 𝑎𝑖+1. As a result, the number of pieces will decrease by 1.

For example, if 𝑛=5, 𝑘=2 and 𝑎=[3,2], it is optimal to do the following:

  • Divide the piece with length 2 into two pieces with lengths 2−1=1 and 1, as a result 𝑎=[3,1,1].
  • Merge the piece with length 3 and the piece with length 1, as a result 𝑎=[4,1].
  • Merge the piece with length 4 and the piece with length 1, as a result 𝑎=[5].

find the minimum number of operations he needs to do in order to merge the casserole into one piece with length 𝑛.(2≤𝑛≤10^9, 2≤𝑘≤10^5)

The second line contains 𝑘 integers 𝑎1,𝑎2,…,𝑎𝑘 (1≤𝑎𝑖≤𝑛−1, ∑𝑎𝑖=𝑛) 

욕심 많은 생각, 항상 가장 큰 수 이외의 수를 분해함

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define i64 long long
  4. void solve(){
  5. int n, k;
  6. cin >> n >> k;
  7. vector<int> a(k);
  8. for(int i = 0; i < k; i ++) cin >> a[i];
  9. sort(a.begin(), a.end());
  10. i64 res = 0;
  11. for(int i = 0; i < k - 1; i ++){
  12. if(a[i] == 1)
  13. res += 1;
  14. else{
  15. res += (a[i] + a[i] - 1);
  16. }
  17. }
  18. cout << res << endl;
  19. }
  20. int main(){
  21. ios::sync_with_stdio(false);
  22. cin.tie(0);
  23. int T;
  24. cin >> T;
  25. while(T--)
  26. solve();
  27. return 0;
  28. }

C. 고릴라와 순열

 three numbers 𝑛, 𝑚, and 𝑘 (𝑚<𝑘).  construct a permutation† of length 𝑛,For the permutation, 𝑔(𝑖) is the sum of all the numbers in the permutation on a prefix of length 𝑖 that ~이다 not greater than 𝑚

𝑓(𝑖) is the sum of all the numbers in the permutation on a prefix of length 𝑖 that are not less than 𝑘.

find a permutation for which the value of (∑ni=1f(i)−∑ni=1g(i)) is maximized.(2≤𝑛≤10^5; 1≤m<k≤n)

f()를 가장 크게 만들고, 큰 것을 앞에 두고, g()를 가장 작게 만들고, 작은 것을 앞에 둡니다.

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define i64 long long
  4. void solve(){
  5. int n, k, m;
  6. cin >> n >> m >> k;
  7. for(int i = 0; i < n - m; i ++){
  8. cout << n - i << " ";
  9. }
  10. for(int i = 0; i < m; i ++)
  11. cout << i + 1 << " n"[i == m - 1];
  12. }
  13. int main(){
  14. ios::sync_with_stdio(false);
  15. cin.tie(0);
  16. int T;
  17. cin >> T;
  18. while(T--)
  19. solve();
  20. return 0;
  21. }

D. 사랑의 시험

우리는 이 사랑을 시험하기로 했습니다. ErnKor는 강을 헤엄쳐 건너야 합니다. 폭 1미터 그리고a length of 𝑛 meters.따라서 전체적으로 (즉, throughout the entire swim from 0 to 𝑛+1) ErnKor는 물속에서 수영할 수 있습니다 for no more than 𝑘 meters.

They are located at the 0 and 𝑛+1 meters respectively. The river can be represented as 𝑛 segments, each with a length of 1 meter. Each segment통나무 'L', 악어 'C' 또는 물 'W'만 포함합니다.. ErnKor는 다음과 같이 움직일 수 있습니다:

  • 만약 그가 표면에 있다면 (즉, 강둑이나 통나무 위에), he can jump forward for no more than 𝑚 (1≤m≤101≤𝑚≤10) meters (he can jump on the bank, on a log, or in the water).
  • 만약 그가 물속에 있다면, 그는 다음 강 구간까지만 수영할 수 있습니다. (or to the bank if he is at the 𝑛-th meter).
  • ErnKor는 어떤 경우에도 악어가 있는 구간에 착륙할 수 없습니다.

p &lt; n 오랫동안 갇혀 있었습니다. 저도 욕심이 나서 가장 가까운 L을 찾아 동적으로 업데이트했습니다.

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define i64 long long
  4. void solve(){
  5. int n, m, k;
  6. cin >> n >> m >> k;
  7. string tmp;
  8. cin >> tmp;
  9. string s = " " + tmp;
  10. int p = m;
  11. int i = 1;
  12. while(p <= n){
  13. for(int j = i; j <= p && p <= n; j ++){
  14. if(s[j] == 'L')
  15. p = j + m;
  16. }
  17. if(p > n)
  18. break;
  19. while(p <= n && s[p] == 'W' && k >= 0){
  20. k --;
  21. p ++;
  22. }
  23. if(k < 0 || ( p <= n && s[p] == 'C')){
  24. cout << "No" << endl;
  25. return;
  26. }else
  27. i = p;
  28. }
  29. cout << "Yes" << endl;
  30. }
  31. int main(){
  32. ios::sync_with_stdio(false);
  33. cin.tie(0);
  34. int T;
  35. cin >> T;
  36. while(T--)
  37. solve();
  38. return 0;
  39. }