A. Polycarp and the Day of Pi
做一个匹配即可
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define lowbit(x) ((x)&-(x))
int main() {
::sync_with_stdio(false);
ios="31415926535897932384626433832795028841971";
string pint T;
>>T;
cinwhile(T--)
{
;
string in>>in;
cinint ans=0;
for(int i=0;i<30&&i<p.length()&&i<in.length();i++)
{
if(p[i]==in[i])
++;
anselse
break;
}
<<ans<<'\n';
cout}
return 0;
}
B. Taisia and Dice
根据题意知道拿走的那个最大值为s-r
,可以先将最大值输出,剩下的r
剩余数平分,再补上余数即可.
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define lowbit(x) ((x)&-(x))
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
int n,s,r;
>>n>>s>>r;
cinint m=s-r;
<<m<<' ';
coutfor(int i=1;i<=r%(n-1);i++)
<<r/(n-1)+1<<' ';
coutfor(int i=r%(n-1)+1;i<n;i++)
<<r/(n-1)<<' ';
cout<<'\n';
cout}
return 0;
}
C. Premutation
我是把第一组输入当做默认数组,在剩下的输入中寻找默认数组中未出现的数m
的位置site
.
将site
更新为其最大值,发现在此值之前的位置都可以按默认数组中的顺序输出,然后接一个m
,后面接上剩余的默认数组中的数.
如果site
为1
,那么m
应放在默认数组之前.
如果site
为n-1
,那么需要判断一下site
是否一直为n-1
,如果是,那么m
在最后,如果不是,正常输出.
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define lowbit(x) ((x)&-(x))
const int N=105;
int a[N][N];
int o[N];
int vis[N];
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
(vis,false,sizeof(vis));
memset(o,0,sizeof(o));
memset(a,0,sizeof(a));
memsetint n;
>>n;
cinfor(int i=1;i<n;i++)
{
>>o[i];
cin[o[i]]=true;
vis}
int m=0;
for(int i=1;i<=n;i++)
{
if(!vis[i])
{
=i;
mbreak;
}
}
int site=0;
for(int i=1;i<n;i++)
{
for(int j=1;j<n;j++)
{
>>a[i][j];
cin}
}
for(int i=1;i<n;i++)
{
for(int j=1;j<n;j++)
{
if(a[i][j]==m)
{
=max(site,j);
sitebreak;
}
}
}
if(site==1)
{
<<m<<' ';
coutfor(int i=1;i<n;i++)
<<o[i]<<' ';
cout<<'\n';
cout}
else if(site==n-1)
{
bool flag=false;
for(int i=1;i<n;i++)
{
if(a[i][n-1]!=m)
{
=true;
flagbreak;
}
}
if(!flag)
{
for(int i=1;i<n;i++)
<<o[i]<<' ';
cout<<m<<'\n';
cout}
else
{
for(int i=1;i<site;i++)
<<o[i]<<' ';
cout<<m<<' ';
coutfor(int i=site;i<n;i++)
<<o[i]<<' ';
cout<<'\n';
cout}
}
else
{
for(int i=1;i<site;i++)
<<o[i]<<' ';
cout<<m<<' ';
coutfor(int i=site;i<n;i++)
<<o[i]<<' ';
cout<<'\n';
cout}
}
return 0;
}
D. Matryoshkas
可以想到将每个数出现的次数当成纵坐标,横坐标为每个数,考虑这个生成的直方图,只需要一层一层地拿掉所有的高度即可.
因为 map
优化.
一开始想的是用类似括号匹配一样的方法,但这样会有多重循环,最差情况会有平方级复杂度,会炸掉.
发现可以只考虑上坡,下坡根本不用管.
只需要统计连续的上坡(严谨来说是不下坡)的区间,计算高度即可.
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define lowbit(x) ((x)&-(x))
const int N=2e5+5;
int a[N];
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
int n;
>>n;
cinint ans=0;
<int,int>mp;
mapfor(int i=1;i<=n;i++)
{
>>a[i];
cin}
(a+1,a+1+n);
sortfor(int i=1;i<=n;i++)
{
[a[i]]++;
mp}
auto it=mp.begin(),itt=mp.begin();
++;
it+=itt->second;
answhile(it!=mp.end())
{
if(it->first>itt->first+1)
{
+=it->second;
ans++,itt++;
itcontinue;
}
if(it->second>itt->second)
{
+=it->second-itt->second;
ans}
++,itt++;
it}
<<ans<<'\n';
cout}
return 0;
}
耗时124ms,占用内存7200KB.
后来去看其他人提交的代码,有很简洁的,下面贴一份.
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define lowbit(x) ((x)&-(x))
const int N=2e5+5;
int a[N];
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
int n;
>>n;
cinfor(int i=1;i<=n;i++)
>>a[i];
cinint ans=0;
(a+1,a+1+n);
sort<int,int> mp;
mapfor(int i=1;i<=n;i++)
{
if(!mp[a[i]-1])
{
++;
ans[a[i]]++;
mp}
else
{
[a[i]-1]--;
mp[a[i]]++;
mp}
}
<<ans<<'\n';
cout}
return 0;
}
耗时156ms,占用内存13500KB.
E. Vlad and a Pair of Numbers
首先可以发现x
为奇数的时候不行(转为二进制后末尾的1
无法处理).
x
为偶数时,构造
防止
AC代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
//#define lowbit(x) ((x)&-(x))
int main() {
::sync_with_stdio(false);
iosint T;
>>T;
cinwhile(T--)
{
;
ll x>>x;
cinif(x%2!=0)
{
<<-1<<'\n';
coutcontinue;
}
=x+(x>>1);
ll a=(x>>1);
ll b=a^b;
ll tmpif(tmp==x)
<<a<<' '<<b<<'\n';
coutelse
<<-1<<'\n';
cout}
return 0;
}