开始: 2024-06-09 14:30:00

20240609

结束: 2024-06-09 17:30:00
当前: 2025-0505-3030 12:02:37  类型:单人排位赛 状态:已经结束 

A-第k小

#include<iostream>
#include<cstdio>
using namespace std;
int n,k,b[30010],gs,a;
int main()
{
cin>>n>>k;//输入n和k
for(int i=1; i<=n; i++)
{
cin>>a;
b[a]++;//用数组计数的方法把数存进去
}
for(int i=1; i<=30000; i++)
{
if(b[i]>=1) gs++;//由于相同的数存在一个数组里,所以不用去重
if(gs==k)
{
cout<<i; //找出第k小,输出
return 0;
}
}
cout<<"NO RESULT";//否则找不出第k小
return 0;
}

B-超能侠的矩形

#include<iostream>
using namespace std;
int n,m;
char ma[1005][1005];
int main()
{
cin>>n>>m;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
cin>>ma[i][j]; //读入方阵
int ans=0;
for(int i=1; i<=n; i++)
for(int j=1; j<=m; j++)
if(ma[i][j]=='a') //如果有a,就枚举搜b
{
if(i>=4&&ma[i-1][j]=='b'&&ma[i-2][j]=='a'&&ma[i-3][j]=='b') ans++; //向上穷举
if(i<=n-3&&ma[i+1][j]=='b'&&ma[i+2][j]=='a'&&ma[i+3][j]=='b') ans++; //向下穷举
if(j>=4&&ma[i][j-1]=='b'&&ma[i][j-2]=='a'&&ma[i][j-3]=='b') ans++; //向左穷举
if(j<=m-3&&ma[i][j+1]=='b'&&ma[i][j+2]=='a'&&ma[i][j+3]=='b') ans++; //向右穷举
}
cout<<ans<<endl; //输出答案
return 0;
}

C-又是校门外的树

#include<bits/stdc++.h>
using namespace std;

int l,n;
bool opt;//判断是砍树还是种树
int a,b;
int flag[10005];//flag=1时是树,flag=2时是树苗,flag=0时是空坑
int ans1,ans2;//ans1记录最终校门外留下的树苗棵数,ans2记录植树者种上又被砍掉的树苗棵数

int main()
{
cin>>l>>n;
//编号从0开始,到l结束
for(int i=0;i<=l;++i) flag[i]=1;//初始化,把树都种上
for(int i=0;i<n;++i)
{
cin>>opt>>a>>b;
if(opt==0)//如果是砍树
{
for(int j=a;j<=b;++j)
{
if(flag[j]==2) ans2++;//如果砍的是树苗
flag[j]=0;//让flag=0,即记为空坑
}
}
else//如果是种树
{
for(int j=a;j<=b;++j)
if(flag[j]==0) flag[j]=2;//如果遇到一个空坑,就把树苗种上,把flag变为2
}
}
for(int i=0;i<=l;++i) if(flag[i]==2) ans1++;//如果校门口有树苗的话
cout<<ans1<<endl<<ans2;
return 0;
}

D-无穷序列

每组循环的长度依次+1,所以第n个1前的长度为n(n-1)/2(等差数列求和),第n个1的位置为n(n-1)/2+1。

这样,对于一次询问给出的 k ,我们只需判断方程 n(n-1)/2+1=k 有无正整数解。若有,则输出“1”,否则输出“0”。

显然是一个一元二次方程求解的问题,按数学方法求解即可。

#include<bits/stdc++.h>
using namespace std;
long long n;
long long work(long long k)
{
//( n^2 + n ) / 2 + 1 = k
//化简即 0.5 n^2 + 0.5 n + ( 1 - k ) = 0
//即 n^2 + n + ( 2 - 2k ) = 0
//若有整数解,sqrt( 8k-7 ) 是奇数
long long n = sqrt( k * 8 - 7 );
return n * n == k * 8 - 7 && n % 2 ;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int k;
scanf("%lld",&k);
printf("%lld\n",work(k));
}
return 0;
}

E-学生分组

#include<bits/stdc++.h>
using namespace std;
int s[1001];
int main()
{
long long int n,l,r,a=0,b=0,sum=0;//a,b分别为超出上界和超出下界两种情况,sum为累加器
cin>>n;
for(int i=1; i<=n; i++)
{
cin>>s[i];
sum+=s[i];//存储总人数用
}
cin>>l>>r;
for(int i=1; i<=n; i++)
{
if(s[i]>r)
a+=s[i]-r; //判断超出上界
if(s[i]<l)
b+=l-s[i]; //判断超出下界
}
if(sum>n*r)//特判输出为-1
cout<<"-1"<<endl;
else if(sum<n*l)
cout<<"-1"<<endl;
else
cout<<max(a,b)<<endl;
return 0;
}