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枚举

posted @   翔村亲亲鸟  阅读(19)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示