牛客小白月赛56 回顾(C- F)

C 阿宁吃粽子

先求出每一位要分配几个粽子,然后贪心的从大到小分配(每种主意把美味值大的放后面)

#include<bits/stdc++.h>
using namespace std;
        
#define fi first
#define se second  
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef unsigned long long ull;
typedef long long ll;
const int N = 1e6+10;
const int NN = 1e5+100;
const int pp = 998244353;
typedef pair<int,int>PII;
const int inf = 2147483647;

bool cmp(int c,int d){
	return c>d;
}

int n,a[N];
int b[11],d[11];
int c[10][NN];

int main(){
	
	cin>>n;
	
	for(int i=1;i<=n;i++){
		cin>>a[i];
		b[i%10]++;
	}
	
	sort(a+1,a+1+n,cmp);
	
	int kk=0;
	
	for(int i=9;i>=0;i--){//先放大的
		for(int j=b[i];j>=1;j--){//大的后置	
			c[i][j]=a[++kk];
		}
	}
	
	for(int i=1;i<=n;i++){
		int f = i%10;
		cout<<c[f][++d[f]]<<" ";
	}
	return 0;
}

D 阿宁的质数

最多 2e5 个质数
线性筛出前 2e5 质数 ,放入set 中,每次遇到素数就在set中删除,然后取出set头部元素,既是要找的答案;

#include<bits/stdc++.h>
using namespace std;
        
#define fi first
#define se second  
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef unsigned long long ull;
typedef long long ll;
const int N = 3e6;
const int NN = 2e5+10;
const int pp = 998244353;
typedef pair<int,int>PII;
const int inf = 2147483647;


set<int>st;

int prime[N+10],cnt,n,q,k;
bool vis[N+10];
int a[NN],ans[NN];

void isprime(){
	vis[1]=1;
	vis[0]=1;
	for(int i=2;i<=N;i++){
		if(!vis[i]){
			prime[++cnt]=i;
			st.insert(i);
		}
		for(int j=1;j<=cnt&&i*prime[j]<=N;j++){
			vis[i*prime[j]]=1;
			if(i%prime[j]==0) break;
		}
	}
}


int main(){
	
	isprime();
	
	cin>>n>>q;
	
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(a[i]>3000000){
			ans[i]=*st.begin();
		}else if(!vis[a[i]]){
			st.erase(a[i]);
			ans[i]=*st.begin();
		}else{
			ans[i]=*st.begin();
		}
	}	
	
	for(int i=1;i<=q;i++){
		scanf("%d",&k);
		printf("%d\n",ans[k]);
	}
	
	return 0;
}

E 阿宁睡大觉

找出所有‘Z’之间的距离,贪心消除即可

#include<bits/stdc++.h>
using namespace std;
        
#define fi first
#define se second  
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef unsigned long long ull;
typedef long long ll;
const int N = 2e5+10;
const int NN = 2e5+10;
const int pp = 998244353;
typedef pair<int,int>PII;
const int inf = 2147483647;

int n,m,f;
string s;
vector<int>ve;
ll ans;

int main(){
	
	cin>>n>>m>>s;
	
	int len = s.size();
	
	for(int i = 0 ; i < len ; i++){
		if(s[i] == 'Z'){
			f = i;
			break;
		}
	}
	
	for(int i = f + 1 ;i < len ; i++ ){
		if(s[i]=='Z'){
			ve.push_back(i-f-1);
			f = i;
		}
	}
	
	sort(ve.begin(),ve.end());
	
	for(auto k : ve){
		if(m>=k){
			ans+=4;
			m-=k;
		}
	}
	
	cout<<ans;
	return 0;
}

反思:注意多举例子多举例子

F 阿宁去游玩

魔法可以使用无数次,也就是说两个城市之间的状态可以相同也可以不同,每次添加两个城市之间最小权值跑最短路

注意,当在一个节点使用魔法时,其他任意两个节点的相对属性是不变的,使用魔法前两个节点属性不同使用后属性依然不同

注意数组大小
注意初始化大小

#include<bits/stdc++.h>
using namespace std;
      
#define fi first
#define se second  
#define IOS std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
typedef long long ull;
typedef unsigned long long ll;
const int N = 1e6+10;
const int NN = 1e6+100;
const int pp = 1e9+7;
typedef pair<int,int>PII;
const ll inf = 1e18 + 10;
priority_queue<PII,vector<PII>,greater<PII> >qu;

int to[N],head[N],nex[N],val[N],cnt,u,v,w,n,m,x,y,z;
bool vis[N];
ll dis[N];
int s[N];

void add(int u,int v,int w)
{
	to[++cnt]=v;
	val[cnt]=w;
	nex[cnt]=head[u];
	head[u]=cnt;
}
//一定是 ++cnt
int main()
{
	cin>>n>>m>>x>>y>>z;
	for(int i=1;i<=n;i++) cin>>s[i];
	
	for(int i=1;i<=n;i++) dis[i]=inf;
	dis[1]=0;
	
	for(int i=1;i<=m;i++)
	{
		cin>>u>>v;
		if(s[u]==s[v]){
			add(u,v,min(x,y+z));
			add(v,u,min(x,y+z));
		}else{
			add(u,v,min(y,x+z));	
			add(v,u,min(y,x+z));
		}
	}
	
	qu.push({0,1});
	
	while(!qu.empty())
	{
		int t=qu.top().se;
		qu.pop();
		
		if(vis[t]) continue;
		else vis[t]=1;
		
		for(int i=head[t];i;i=nex[i])
		{
			if(dis[t]+val[i]<dis[to[i]])
			{
				dis[to[i]]=dis[t]+val[i];
				qu.push({dis[to[i]],to[i]});
			}
		}
	}
	
	cout<<dis[n];
	
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦里再与你相见

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值