牛客周赛 Round 47(A-E)

A 小红的葫芦

题目大意:给一个5个元素的数组,如果有两个相同的元素,同时另外三个元素也相同,但是这五个元素不能一样,符合输出“YES”,反之输出“NO”

分析:遍历一下就好了

代码:

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

int a[110];
int main (){
	for (int i=0;i<5;i++){
		int x;
		cin >> x;
		a[x]++;
	}
	bool st1=false,st2=false,st3=true;
	for (int i=0;i<110;i++){
		if (a[i]==3) st1=true;
		if (a[i]==2) st2=true;
		if (a[i]==5) st3=false;
	}
	if (st1 && st2 && st3) cout << "YES";
	else cout << "NO";
	return 0;
}

B 茉茉的密码

题目大意:给n个字符串,然后任意输出一个公共子串

分析:单个字母也是公共子串

代码:

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

const int N=1e5+10;

int a[N][30];

void solve(){
	int n;
	cin >> n;
	for (int i=0;i<n;i++){
		string str;
		cin >> str;
		int len=str.length();
		for (int j=0;j<len;j++){
			a[i][str[j]-'a']++;
		}
	}
	for (int i=0;i<30;i++){
		bool st=true;
		for (int j=0;j<n;j++){
			if (a[j][i]==0){
				st=false;
			}
		}
		if (st){
			char x=i+'a';
			cout << x <<endl;
			return; 
		}
	}
}

int main (){
	solve();
	return 0;
}

C 苗苗的气球

题目大意:有n种个不同颜色气球,每种ai​个,两个不同颜色气球接触后就会一起爆炸,最后气球没了或者只剩下了一个颜色的气球,求其可能性。

分析:三种情况,当气球总和小于2倍的气球最大数量,最后肯定剩这一种,当气球总和等于2倍的气球最大数量时,最后没有剩,然后当气球总和大于2倍气球最大数量时,遍历每个气球,如果总和减去这个气球数,剩下的时偶数,则 撞完了,如果为奇数,只需要当前遍历气球数量大于1就好了

代码:

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

const int N=1e5+10;

int a[N];

int main (){
	int n;
	cin >> n;
	int sum=0,Max=0;
	for (int i=0;i<n;i++){
		cin >> a[i];
		sum+=a[i];
		Max=max(Max,a[i]);
	}
	if (sum<2*Max){
		cout << 1 << endl;
	}
	else if (sum==2*Max){
		cout << 0 << endl;
	}
	else{
		int cnt=0;
		for (int i=0;i<n;i++){
			int tmp=sum;
			tmp-=a[i];
			if (tmp%2==0){
				cnt++;
			}
			else{
				if (a[i]>1){
					cnt++;
				}
			}
		}
		cout << cnt << endl;
	}
	return 0;
}

D 萌萌的好数

题目大意:满足两项其中之一便不是好数 1.该数对3取模不为 0,2.该数的最后一位数字不为 3
请你告诉他第n个好数是什么。

分析:找规律,会发现,每10个数字中6个好数,然后你从第几个好数反推一下就可以了

代码:

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

const int N=1e5+10;


void solve(){
	ll n;
	cin >> n;
	ll cnt=(n-1)/6*10;
	ll q=(n-1)%6;
	for (ll i=cnt;i<=cnt+10;i++){
		if (i % 3!=0 && i%10!=3){
			if (q==0){
				cout << i << endl;
				return;
			}
			q--;
		}
	} 
}

int main (){
	int t;
	cin >> t;
	while(t--){
		solve();
	}
	return 0;
}

E 茜茜的计算器

题目大意:一个计算器可以显示 1-9,然后求n位组成的轴对称图形的种类,如n=2,就有
00,01,03,08,
10,11,13,18,
25,
30,31,33,38,
52,
80,81,83,88。

这里的轴对称,不管x,还是y轴都可以

分析:x轴对称:0,1,3,8;y轴对称:0,1,2,5,8,右边固定;x,y轴对称:0,8;

只要x轴对称的个数+y轴对称的个数-x,y轴对称的个数就好了

代码:

#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <cstring>
#include <cmath>

using namespace std;

typedef long long ll;
typedef pair<int,int> PII;

const ll p=1e9+7;

ll qmi(ll a,ll b){
	ll res=1%p;
	while(b){
		if (b&1) res=res*a%p;
		a=a*a%p;
		b>>=1;
	}
	return res;
}

int main (){
	ll n;
	cin >> n;
	ll ans1=qmi(4,n)%p;
	ll ans2=qmi(4,n/2)%p;
	ll ans3=qmi(2,n/2)%p;
	if (n%2==1){
		ans2=ans2*2%p;
		ans3=ans3*2%p;
	}
	cout << (ans1+ans2-ans3+p)%p;
	return 0;
}

总结:本身难度不高,就是c上细节比较多,Fdebug半天没出来,好痛苦。

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
牛客 a卷2022年第四季度的华为题目中,要求考生设计一种高效的数据结构,能够支持以下几种操作: 1. 添加一个元素 2. 删除一个元素 3. 查找是否存在某个元素 4. 返回元素的总数 该数据结构要求满足空间复杂度较小、时间复杂度较低、能够快速地进行查找和修改等多种操作。 想要编写这样一种数据结构,我们可以参考许多已有的经典算法与数据结构,如二叉树、哈希表、红黑树等,通过综合利用它们的优点来实现这个问题的解决。 例如,我们可以通过哈希表来存储所有元素的值,并在每个哈希链表的元素中再使用红黑树来进行排序与查找。这样,我们既能够轻松地进行元素的添加和删除操作,也能够在查找较大数据范围和数量时保持较高的速度与效率。同时,由于使用了多个数据结构来协同完成这个问题,我们也能够在空间复杂度上适度地进行优化。 当然,在具体设计这个数据结构的过程中,我们还需要考虑一些实践中的细节问题,例如如何避免哈希冲突、如何处理数据丢失与被删除元素所占用的空间等问题,这都需要相应的算法与流程来进行处理。 总体来看,设计这种支持多种操作的高效数据结构,需要我们具备丰富的算法知识和编程实践能力,同时需要我们在具体处理问题时能够将多种算法和数据结构进行有效地结合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值