当前位置:网站首页>Codeworks round 638 (Div. 2) cute new problem solution
Codeworks round 638 (Div. 2) cute new problem solution
2022-07-05 08:51:00 【Qizi K】
Codeforces Round #638 (Div. 2) Cute new problem solution ~
The official solution of the author ~
This time A-D They are all greedy !
A. Phoenix and Balance
The question : With 2 The first item ,2 An equal ratio sequence of common ratio , It is required to be divided into two series , To minimize the difference between the sum of these two series .
tips: You can find , The th of this arithmetic sequence n Items are larger than the previous sum , So it must be the first n Xiang Heqian n/2-1 Items form a sequence , The rest is another sequence .
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int t,n;
ll quick_pow(int x, int n){
ll res = 1;
while(n){
if(n & 1) res = res * x;
n >>= 1;
x *= x;
}
return res;
}
int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
ll ans = 0,tmp1,tmp2;
tmp1 = 2 * (quick_pow(2, n - 1) - 1);
tmp2 = 2 * (quick_pow(2, n / 2 - 1) - 1);
printf("%lld\n",quick_pow(2, n) - tmp1 + 2 * tmp2);
}
return 0;
}
P.S. Yes 2 The power of can be directly done by bit operation , No quick power ~ I was stupid when I did it .
B. Phoenix and Beauty
The question : Add no more than n The number of , So that all the lengths are k The subsequence of and are equal .
Such as : 1 2 2 1 k=3, be Added as 1 2 1 2 1, And for 4.
tips: Notice that it must be periodic It's OK . And there are Different numbers cannot be more than k individual ( Otherwise, it is impossible to construct a period of k Sequence of numbers ). Be careful Don't be the shortest . I wrote it so ugly that I didn't let it go Thinking is more troublesome , It's the number that keeps recurring in cycles
The idea of the answer is very clever ! If the original sequence just k individual Different numbers , Just repeat the output directly ; If not enough k individual , It's just Each cycle is followed by k-size individual 1(or Arbitrary number ). Constitute a cycle of k Sequence of numbers . So the original sequence n Number , Each one must correspond to 1 A cycle ( Because the shortest time is not required ).
#include <bits/stdc++.h>
using namespace std;
void solve(){
int N,K;
cin>>N>>K;
set<int>s;
for (int i=0;i<N;i++){
int a;
cin>>a;
s.insert(a);
}
//if more than K distinct numbers, print -1
if (s.size()>K){
cout<<-1<<endl;
return;
}
cout<<N*K<<endl;
for (int i=0;i<N;i++){
//print the distinct numbers
for (int b:s)
cout<<b<<' ';
//print the extra 1s
for (int j=0;j<K-(int)s.size();j++)
cout<<1<<' ';
}
cout<<endl;
}
int main(){
int t; cin>>t;
while (t--)
solve();
}
C. Phoenix and Distribution
The question : Give a string , It is required to arrange and combine the letters in any order to form k A string ( Does not require It's a substring of the original string ), Make this k The string with the largest dictionary order is the smallest ~
tips: At first, the algorithm was wrong ~
Pay attention to the classified discussion :
1. If after sorting book[1] != book[k] The answer is book[k]( You can put the latter ones in the first string );
hold book[1]-book[k] be assigned to k In a string , And then from the k+1 Start :
2. If the later ones are not the same , Then put them all in the first string , Is the answer ( Pay attention to and 3 distinguish );
3. If the later ones are the same , Share equally as much as possible k In a string , Finally, more than one is placed in the first string , The first string is the answer .
e.g. aaaab k = 2 The output should be aaab; and aaaaa k = 2 Then it should output aaa instead of aaaa.
At first, the wrong idea was that if the number of letters was k The multiple of is divided equally . Counter examples can be cited :
aaabbbccc k = 3, The output should be abbbccc instead of abc.
#include<bits/stdc++.h>
using namespace std;
int t,n,k;
char c,book[100005];
void solve(){
scanf("%d%d",&n,&k);
getchar();
for(int i = 1; i <= n; ++i)
scanf("%c",&book[i]);
sort(book + 1, book + 1 + n);
if(book[1] != book[k]){
// Corresponding to the above situation 1
printf("%c\n",book[k]);
return ;
}
printf("%c",book[1]); // Corresponding to the above situation 3
if(book[k + 1] == book[n]){
int tmp = ceil((double)(n - k) / k); // Pay attention to cast. Otherwise, divide two integers ……
for(int i = 1; i <= tmp; ++i)
printf("%c",book[k + 1]); // Corresponding to the above situation 2
}else{
for(int i = k + 1; i <= n; ++i)
printf("%c",book[i]);
}
putchar('\n');
}
int main(){
scanf("%d",&t);
while(t--){
solve();
}
return 0;
}
D. Phoenix and Science
The question : bacteria The initial mass is 1, The initial number is 1. Day Any number of bacteria can choose to divide ( The quality is divided into two ). evening The mass of each bacterium +1. Ask if it happens to take several days , The sum of all bacterial masses is x.( Certainly . Even if it doesn't split, it's always 1+1+1 Fine ) If possible , Find the shortest number of days and how many bacterial divisions per day .
tips:
1. Notice the split in the daytime , Gain weight at night , There is no conflict between the two ;
2. Division can be only partial .
Observation can reveal , If there has been only one bacterium , Then each weight gain is 1, The total weight is 1+1+1+……1
If it split into two , Then the total weight :1+2+2+……+2
And so on , The shortest number of days is Every day all split ( And growth is a 2 An equal ratio sequence of common ratio ), Until one day, if all split, it will exceed the requirements . Then sort , The number of splits per day is book[i] - book[i-1]( If not split ,book[i] == book[i-1], More represents the number of multiple divisions . Because every split one , Total weight that night +1.book The array represents the day increase Weight of )
e.g. 20 Can be divided into 1 2 4 8 5, After sorting, it becomes 1 2 4 5 8
be : Day one split 1 individual , The next day split 2 individual , The third day split 1 individual (5-4), The fourth day split 3 individual (8-5).
Greedy code :
#include<bits/stdc++.h>
using namespace std;
int t,n,cnt,book[100005];
void solve(){
scanf("%d",&n);
cnt = 0;
for(int i = 1; i <= n; i <<= 1){
book[++cnt] = i;
n -= i; // This step is very important , Always update what is still needed n value ( Additional weight )
}
if(n > 0) book[++cnt] = n;
sort(book + 1, book + 1 + cnt);
printf("%d\n",cnt - 1);
for(int i = 1; i < cnt; ++i)
printf("%d ",book[i + 1] - book[i]);
putchar('\n');
}
int main(){
scanf("%d",&t);
while(t--){
solve();
}
return 0;
}
边栏推荐
- Basic number theory - fast power
- Guess riddles (3)
- kubeadm系列-01-preflight究竟有多少check
- Reasons for the insecurity of C language standard function scanf
- 【日常训练--腾讯精选50】557. 反转字符串中的单词 III
- Warning: retrying occurs during PIP installation
- Redis实现高性能的全文搜索引擎---RediSearch
- Ros-10 roslaunch summary
- Business modeling | process of software model
- Guess riddles (8)
猜你喜欢

Mathematical modeling: factor analysis

Pytorch entry record

Halcon affine transformations to regions

猜谜语啦(142)

猜谜语啦(7)

Lori remote control LEGO motor

Halcon clolor_ pieces. Hedv: classifier_ Color recognition

猜谜语啦(3)

Programming implementation of ROS learning 6 -service node

TF coordinate transformation of common components of ros-9 ROS
随机推荐
AdaBoost use
[matlab] matlab reads and writes Excel
猜谜语啦(6)
Halcon: check of blob analysis_ Blister capsule detection
How can fresh students write resumes to attract HR and interviewers
The location search property gets the login user name
Guess riddles (7)
Guess riddles (9)
Mathematical modeling: factor analysis
皮尔森相关系数
ROS learning 1- create workspaces and function packs
图解八道经典指针笔试题
Low code platform | apaas platform construction analysis
Guess riddles (2)
Guess riddles (3)
File server migration scheme of a company
Explore the authentication mechanism of StarUML
Latex improve
猜谜语啦(9)
319. 灯泡开关