2021牛客寒假算法基础集训营1 蒟弱补题日记
B. 括号
题解:
赛后被增加的数据hack了,正确应该这样做,首先左右两边括号个数相差更少这样更节省括号,那么我们令m=sqrt(k), a=k/m,b=k%r,首先输出m个左括号,并且再第b个左括号后面输出一个右括号。最后输出a个右括号
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define mem(a,b) memset(a,b,sizeof a)
#define PII pair<int,int>
using namespace std;
const int N = 1e5+9;
const int E=1e5;
char stk[N];
int main()
{
int k;
cin>>k;
if(k==0) puts("(");
else
{
int m = sqrt(k);
int a = k/m;
int b = k%m;
for(int i=1; i<=m; i++)
{
printf("(");
if(i==b) printf(")");
}
for(int i=1; i<=a; i++)
{
printf(")");
}
}
return 0;
}
I. 限制不互素对的排列
题解:
这道题,我想大多没过的人都和我一样想复杂了吧。注意 k<=n/2
很关键的是,1~n,包含n/2个偶数(两个偶数之间gcd肯定>1)
我们分两种范围
- k<=5, 如果k=n/2,找不到n/2+1个偶数凑成n/2对gcd>1的排列,输出-1,如果k<n/2, 那么直接把前k+1个偶数放在放在前面,其余数依次排列输出
- k>5, 注意gcd(3,6)>1.
1 如果k<n/2, 那么直接把前k+1个偶数放在放在前面,其余数依次排列输出
2 如果k==2, 直接把前n/2个偶数(除6以外)放在前面输出,然后输出6 3,然后依次输出剩余的数。共n/2+1个数凑成n/2对gcd>1
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define N 100010
using namespace std;
int vis[N];
int cnt;
int n,k;
void print()
{
for(int i=1; i<=n; i++)
{
if(!vis[i]) cout<<i<<" ";
}
}
int main()
{
IOS;
cin>>n>>k;
if(n<=5)
{
if(k==n/2) puts("-1");
else
{
for(int i=2; i<=n&&cnt<k+1; i+=2)
{
cout<<i<<" ";
vis[i] = 1;
cnt++;
}
print();
}
}
else
{
if(k<n/2)
{
//直接前k+1个偶数放到最前
for(int i=2; i<=n&&cnt<k+1; i+=2)
{
cout<<i<<" ";
vis[i] =1;
cnt++;
}
print();
}
else//k==n/2
{
//前n/2个偶数除6以外放在最前面,6和3放在一起,n/2+1个数凑成
//n/2对gcd>1
for(int i=2; i<=n; i+=2)
{
if(i!=6) { cout<<i<<" ";vis[i] = 1;}
}
cout<<6<<" "<<3<<" ";
vis[6]=vis[3]=1;
print();
}
}
return 0;
}
比赛的时候过的代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 1e5+9;
int ans[N];
int p[N],v[N];
int n,k;
int t=0,cnt=0;
int gcd(int a,int b)
{
if(b==0) return a;
else return gcd(b,a%b);
}
void print()
{
for(int k=1; k<=n; k++)
{
if(!v[k]) ans[t++] = k;
}
for(int i=0; i<n; i++) printf("%d ",ans[i]);
}
int main()
{
cin>>n>>k;
for(int i=2; i<=n; i++)
{
if(p[i]) continue;
else
{
ans[t++] = i;
// cout<<i<<endl;
v[i]++;
if(t>1&&gcd(ans[t-2],i)>1) cnt++;
if(cnt==k)
{
print();
return 0;
}
for(int j=2; j*i<=n; j++)
{
if(v[i*j]) continue;
ans[t++] = j*i;
// cout<<i*j<<" ";
v[j*i]++;
p[j*i] = 1;
cnt++;
if(cnt==k)
{
// puts("wa");
print();
return 0;
}
}
}
}
puts("-1");
return 0;
}
A 串
计数: 1dp
2组合
3枚举
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话