A
:https://codeforces.ml/contest/1348/problem/A
依旧和上次的一样的点2的幂次方(1<<k)
#include <bits/stdc++.h>
using namespace std;
void solve(){
int N;
cin>>N;
//note: 1<<X means 2^X
//we put largest coin in first pile
int sum1=(1<<N), sum2=0;
//we put n/2-1 smallest coins in first pile
for (int i=1;i<N/2;i++)
sum1+=(1<<i);
//we put remaining n/2 coins in second pile
for (int i=N/2;i<N;i++)
sum2+=(1<<i);
cout<<sum1-sum2<<endl;
}
int main(){
int t; cin>>t;
while (t--)
solve();
}
B
:https://codeforces.ml/contest/1348/problem/B这一题是我这次遇到的第一个难题,我也被困住在这里,花了一个小时的时间,知道最后也不知道怎么办,我的思路就是先将其中的可以直接形成的最好看的数值表达出来,然后再对不能的进行判断,怎么插入或者根本不弄插入,题目中已经要求了长度,所有我的想法就是先将其中的每一段这样长度的数值表示出来,然后再对其中那一段大小和其他不一样的进行插入数值导致其与前后一致,但是我不会当长度与其原来数组的长度相同时如何进行插入,我猜想了一下感觉应该是前面的数目应该和后面的数一样,所有在插入的时候应该插入前后不同的数,但是这样我感觉太复杂而且写不出来。所有今天看到了答案。其中有set的运用,但是我的set的运用有不太熟,所有又去复习了一下。然后呢我又看到一个博主整理的真的很好,博客地址在这里可以看看
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(1);
cout<<"set 的 size 值为 :"<<s.size()<<endl;
cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
cout<<"set 中的第一个元素是 :"<<*s.begin()<<endl;
cout<<"set 中的最后一个元素是:"<<*s.end()<<endl;
s.clear();
if(s.empty())
{
cout<<"set 为空 !!!"<<endl;
}
cout<<"set 的 size 值为 :"<<s.size()<<endl;
cout<<"set 的 maxsize的值为 :"<<s.max_size()<<endl;
cout<<"set 中1出现的次数的是"
return 0;
}
运行结果,就是很清楚看出来了。其中set最后又插入了1,但是最后的数还是3.以及1出现了两次但是他还是算作一次,因为一个键值在set只可能出现0或1次;
#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){//意思是如果数组中把不同的数的个数如果超过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();
}
看到这个题目那么简单的就做出来,首先我是很生气感觉自己好傻,可是看了代码才发现人家真的好棒啊,要是我肯定在比赛中想不出来这样的办法,我和他最大的相同就是就是我也想先把成立的搞出来然后再对其他不成立进行比较,还有就是他插入的数值还是原来数值中本身含有的数目,并且恰当的地方加入1,然后看看大佬的做法吧,巧妙的代码,首先他运用了set,这个特殊的东西,set是不允许出现相同的元素的,对于后面的循环,比如n,k是6,4,得出的就有24个,如果有三种数字,那么就按出现的顺序输出这三种数字,剩下(k-3)也就是1,输出一个任意但相同的数补足,如此循环6次!最后不就成功了吗?好厉害这个题目。
C
:https://codeforces.ml/contest/1348/problem/C
这一题是第二题做了半天之后搞不出来,然后我就来看了这道题目但是发现还是搞第二题吧,感觉这个题目好像比第二题更难一点,看见官网的代码看到 人家如此简单的代码还是佩服啊。首先进行排序和我的想法刚开始还是一样的,我总是在最开始和人家一样,可能这个最简单的事情吧,哈哈哈。然后就是判单输出呗,他最开始是比较s[0]!=s[k-1]然后又是s[k]!=s[n-1]这个我是没想出来,看到他的代码恍然大悟。
#include <bits/stdc++.h>
using namespace std;
void solve(){
int n,k;
cin>>n>>k;
string s;
cin>>s;
sort(s.begin(),s.end());
//if smallest k letters are not all the same, answer is kth smallest letter
if (s[0]!=s[k-1]){
cout<<s[k-1]<<endl;
return;
}
cout<<s[0];
//if remaining letters aren't the same, we append remaining letters to answer
if (s[k]!=s[n-1]){
for (int i=k;i<n;i++)
cout<<s[i];
}
else{
//remaining letters are the same, so we distribute evenly
for (int i=0;i<(n-k+k-1)/k;i++)
cout<<s[n-1];
}
cout<<endl;
}
int main(){
int t; cin>>t;
while (t--)
solve();
}