感觉这次题挺简单的,两个小时左右的时候感觉甲级就有超过1/10的人满分了。我做了一下,不到三个小时就把乙级和甲级所有的题都过了😂。
7-1 计算数列第n项
a(n+1)为a(n)^3+1的各位数字之和。
#include <bits/stdc++.h>
using namespace std;
int n,a;
int main()
{
cin>>a>>n;
for(int i=1;i<=n;i++)
{
int m=a*a*a+1;
a=0;
while(m)
{
a+=m%10;
m/=10;
}
}
cout<<a;
return 0;
}
7-2 AB变换
用a数组标记数字是否产生,a[i]为1表示产生了,0表示没产生;
用STL的set或者map也可以做。
#include <bits/stdc++.h>
using namespace std;
int a[100010],r;
int main()
{
int m,k,n=0;
cin>>m>>k;
string s;
cin>>s;
for(int i=0;i<s.length();i++)
{
if(s[i]=='A')n/=4;
else n=8*n+1;
if(n<=k)a[n]=1;
}
for(int i=0;i<=k;i++)
{
if(a[i]==1)r++;
}
cout<<r;
return 0;
}
7-3 中秋福利
暴力。
#include <bits/stdc++.h>
using namespace std;
struct s{
string a;int b;
}s[10010];
int n,l,r,num,maxx,ma,mi=100000000;
int main()
{
cin>>n>>l>>r;
for(int i=0;i<n;i++)
{
cin>>s[i].a>>s[i].b;
if(s[i].b>=l&&s[i].b<=r)num++;
if(s[i].b>maxx&&s[i].b<=r)maxx=s[i].b;
if(s[i].b>ma)ma=s[i].b;
if(s[i].b<mi)mi=s[i].b;
}
if(num)
{
cout<<num<<" "<<maxx<<endl;
for(int i=0;i<n;i++)
{
if(s[i].b==maxx)cout<<s[i].a<<endl;
}
}
else cout<<mi<<" "<<ma;
return 0;
}
7-4 爆气球
7-1 Pseudo-completeness
身高为H的人平躺后能压到最多的气球;
因为求最小的坐标,所以遍历每个气球,看往左边H长度有多少个气球,使用二分。
#include <bits/stdc++.h>
using namespace std;
int n,h,a[100010],res,d;
int main()
{
cin>>n>>h;
for(int i=0;i<n;i++)
{
cin>>a[i];
int l=lower_bound(a,a+i,a[i]-h)-a;
if(i-l+1>res)
{
res=i-l+1;
d=a[i]-h;
}
}
cout<<d<<" "<<res;
return 0;
}
7-5 快排第二轮
7-2 The Second Run of Quicksort
判断序列是否是快排第二趟后的序列;
每一次快排会确定当前区间某一个元素的位置;
如果三个以上元素位置确定 或 两个元素位置确定并且包含第一个元素或最后一个元素中的其中一个,则为快排第二趟后的序列。
#include <bits/stdc++.h>
using namespace std;
int t,n,a[100010],b[100010],lmax[100010],rmin[100010],r;
int main()
{
scanf("%d",&t);
while(t--)
{
r=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
lmax[i]=max(lmax[i-1],a[i]);
b[i]=a[i];
}
rmin[n+1]=1000000000;
for(int i=n;i>=1;i--)
{
rmin[i]=min(rmin[i+1],a[i]);
}
sort(b+1,b+n+1);
for(int i=1;i<=n;i++)
{
if(lmax[i]==a[i]&&rmin[i]==a[i]&&a[i]==b[i])r++;
}
if(r>=3||(r==2&&(a[1]==b[1]||a[n]==b[n])))printf("Yes\n");
else printf("No\n");
}
return 0;
}
7-3 Leader of the Opinion Leaders
OLI为 关注他的人/他关注的人,如果超过T就是opinion leaders,找出被最多opinion leaders关注的opinion leaders;
暴力。
#include <bits/stdc++.h>
using namespace std;
int n,t,f[10010],ma;
vector<int>out[10010],in[10010],r;
int main()
{
cin>>n>>t;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
while(x--)
{
int y;
cin>>y;
out[i].push_back(y);
in[y].push_back(i);
}
}
for(int i=1;i<=n;i++)
{
if(in[i].size()/out[i].size()>=t)f[i]=1;
}
for(int i=1;i<=n;i++)
{
int m=0;
for(auto j=in[i].begin();j!=in[i].end();j++)
{
if(f[*j]==1)m++;
}
if(f[i]==1&&m>ma)
{
ma=m;
r.clear();
r.push_back(i);
}
else if(f[i]==1&&m==ma)
{
r.push_back(i);
}
}
for(auto i=r.begin();i!=r.end();i++)
{
if(i!=r.begin())cout<<" ";
cout<<*i;
}
return 0;
}
7-4 Pseudo-completeness
perfect binary tree:每个非叶子结点都有两个孩子,左右叶子结点有相同的深度;
complete binary tree:除了最后一层,每一层都被填满,最有一层结点都靠左;
pseudo-complete binary tree:去掉底层后是perfect binary tree。
dfs,po[]保存后序遍历序列,d为层序遍历从左到右的序号(从0开始),f标记当前序号有无结点,maxD为最大深度;
从前往后找第一个没有被标记的序号:
①为n,且结点数量为2的n次方减1,则为perfect binary tree;
②为n,且结点数量不为2的n次方减1,则为complete binary tree;
③不为n,且在maxD减1层的结点之后,则为pseudo-complete binary tree。
#include <bits/stdc++.h>
using namespace std;
int pr[2010],in[2010],po[2010],f[2010],p,maxD;
void dfs(int x,int l,int r,int d,int le)
{
if(l>r)return;
f[d]=1;
maxD=max(maxD,le);
int i=l;
while(pr[x]!=in[i])i++;
dfs(x+1,l,i-1,d*2+1,le+1);
dfs(x+1+(i-l),i+1,r,d*2+2,le+1);
po[p++]=pr[x];
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>in[i];
for(int i=1;i<=n;i++)cin>>pr[i];
dfs(1,1,n,0,1);
for(int i=0;i<=n;i++)
{
if(f[i]==0)
{
if(i==n&&log2(n+1)==(int)log2(n+1))cout<<1<<endl;
else if(i==n)cout<<2<<endl;
else if(i>=pow(2,maxD-1))cout<<3<<endl;
else cout<<0<<endl;
break;
}
}
for(int i=0;i<n;i++)
{
if(i!=0)cout<<" ";
cout<<po[i];
}
return 0;
}