动物园(zoo)

题目:https://gmoj.net/senior/#main/show/6856

题解:这道题是个智慧+乘法原理。
比赛的时候想到了一半正解,为什么说是一半呢,因为我想多了,而且没想到怎么打,于是只拿了45分。

正解:
找到0~(k-1)中有多少位第i位是可以位1的,假如是x,那么最后答案是2^x-n;
为什么呢?
首先如果有x个位可以为1,每个位只能填0/1两种选择,所以根据乘法原理,就有2^x种答案,但是呢,题目中又给了n个可以的,所以要减n。

如何实现:
我相信一般人的思维都是从n个数中,在m个要求中找到不可以为1的,然后在用k减去,就是x。(反正我就是这么干的)
但是大佬们都是这么干的
设p[i]为如果第i位可以为1,那么p[i]为true,反之则反。
这个寻找可以用o(nk)过。
从1~n中每个a[i],判断从0—(k-1)位是否为1,有则为真,无则为反。
这个时候到m个要求了
我们通过题意可以得到,如果他要求中第i为要为1,但是1~n中没有一个数的二进制码第i为1时这个数就不能为1。
所以我们这里运用以一个bz【i】,代表第i位是否可以为1。如果第i个要求 要求g【i】为1,但是p[ g[i] ] 不为true,就是1~n中没有属于他的数,那么bz[ g[i] ] 就为false。
最后统计0到(k-1)中有多少bz为true,这就是x.

注意:
1.判断第i位是否为1,可以用a[i](表示当前要比较的数) & b[i](表示2^i)。(这个可以用,至少到现在我还没错过,但是如果你不行的话,可以用你的智慧的头脑打代码判断)
2. c++不要用 1<<i 表示2^i,反正我错了。
3. 数据大小要用unsigned long long 。否则会炸,但是当x=64时,因为unsigned long long 最大为2^64-1,最小为0,所以你要手动打表(特判),如果此时n不等于0,那么就这么打 printf("%llu\n",18446744073709551616llu-n);
(18446744073709551616为2^64)
大概就是这么个思路吧,如有问题请各位大佬指正。
代码:

#include<bits/stdc++.h> 
using namespace std;
#define ll  unsigned long long
ll ans=0,n,m,c,k,a[1000001],q,pp,b[101];
bool bz[1001],p[1001];
int main()
{
	freopen("1.in","r",stdin);
//	freopen("zoo.out","w",stdout);
	scanf("%lld%lld%lld%lld",&n,&m,&c,&k);
	b[0]=1;
	for(int i=1;i<=63;i++)
		b[i]=b[i-1]*2;
	memset(p,false,sizeof(p));
	for(int i=1;i<=n;i++)
	{ 
		scanf("%llu",&a[i]);
		for(int j=0;j<=k-1;j++)
			if(a[i]&b[j]) p[j]=true;
	} 
	for(int i=0;i<=k-1;i++)	
		bz[i]=true;
	for(int i=1;i<=m;i++)
	{
		scanf("%llu%llu",&pp,&q);
		bz[pp]=p[pp];
	}
	ll h=0;
	for(int i=0;i<=k-1;i++)
		if(bz[i]) h++;
	if(h==64 && n==0)
		printf("18446744073709551616\n");
	else 
	if(h==64) 
		printf("%llu\n",18446744073709551615llu-(n-1));
	else printf("%llu\n",b[h]-n);
	return 0; 
	fclose(stdin);fclose(stdout);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是实现题目要求的代码: Animal.java ``` public class Animal { private String animalName; public Animal(String animalName) { this.animalName = animalName; } public String getAnimalName() { return animalName; } } class Tiger extends Animal { public Tiger(String animalName) { super(animalName); } } class Eagle extends Animal { public Eagle(String animalName) { super(animalName); } } class Elephant extends Animal { public Elephant(String animalName) { super(animalName); } } ``` Employee.java ``` public class Employee { private String personName; private int age; public Employee(String personName, int age) { this.personName = personName; this.age = age; } public String getPersonName() { return personName; } public int getAge() { return age; } } class Manager extends Employee { public Manager(String personName, int age) { super(personName, age); } } class Breeder extends Employee { private Animal[] animals; public Breeder(String personName, int age, Animal[] animals) { super(personName, age); this.animals = animals; } public Animal[] getAnimals() { return animals; } } ``` Zoo.java ``` public class Zoo { private double area; private Manager manager; private Breeder[] breeders; private Animal[] animals; public Zoo(double area, Manager manager, Breeder[] breeders, Animal[] animals) { this.area = area; this.manager = manager; this.breeders = breeders; this.animals = animals; } public double getArea() { return area; } public Manager getManager() { return manager; } public Breeder[] getBreeders() { return breeders; } public Animal[] getAnimals() { return animals; } public static void main(String[] args) { Tiger tiger1 = new Tiger("Tony"); Tiger tiger2 = new Tiger("Jack"); Elephant elephant1 = new Elephant("Dumbo"); Elephant elephant2 = new Elephant("Manny"); Eagle eagle1 = new Eagle("Baldy"); Eagle eagle2 = new Eagle("Freedom"); Animal[] animals1 = {tiger1, elephant1}; Animal[] animals2 = {tiger2, eagle1, eagle2}; Breeder breeder1 = new Breeder("Alice", 30, animals1); Breeder breeder2 = new Breeder("Bob", 25, animals2); Animal[] animals = {tiger1, tiger2, elephant1, elephant2, eagle1, eagle2}; Manager manager = new Manager("Charlie", 40); Zoo zoo = new Zoo(1000.0, manager, new Breeder[]{breeder1, breeder2}, animals); System.out.println("Zoo area: " + zoo.getArea() + " square meters"); System.out.println("Manager: " + zoo.getManager().getPersonName()); for (Breeder breeder : zoo.getBreeders()) { System.out.println("Breeder: " + breeder.getPersonName()); for (Animal animal : breeder.getAnimals()) { System.out.println(breeder.getPersonName() + " takes care of " + animal.getAnimalName()); } } } } ``` 在main方法中,我们创建了6个动物对象,2个Breeder对象和1个Manager对象,并将这些对象加入到Zoo对象中。我们还通过Breeder对象来关联某个饲养员和他所饲养的动物。最后,我们输出了Zoo对象的一些属性以及每个饲养员所饲养的动物。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值