9.9 csp刷题(相遇问题和动物园)

f0558c90e1ab48b28bb6f2cb52a98009.png

先把刷题网站放在这里吧~题库 - AcWing

第一题,相遇问题,简单题,很显然尽量让两个人走过的路程相近就行。所以只需要把两人的路程差除以2,分别得到两个人需要走的路程,然后再利用1到n的求和公式就能解决了。代码如下:

#include<bits/stdc++.h>
using namespace std;
#define  ll long long
ll a,b,diff,n,m;
ll sum(ll x)
{
    return (x+1)*x/2;
}
int main()
{   
    cin>>a>>b;
    diff=abs(a-b);
    n=diff/2;
    m=diff-n;
    cout<<(sum(n)+sum(m));
    return 0;
}

4a7976d2927c49bc8f758532f93b4d5a.png

第二题,动物园,题目好勾八长,但是最后读下来其实不复杂,饲料种类一点用都没有,实际上就是按照题目给的最大的数目,求出对应的二进制,然后如果这个进制位有饲料要求,就把他设为0,然后如果已有的动物中已经买了这一位的饲料,就把他设为0,没有饲料要求的进制位不用管。

所以这题一开始用普通的思路做,最后TL了。优化了一遍,是将所有已有动物的编号的二进制进行或运算,最后可以得到一个整数,再把把这个整数的二进制位中的1与我们最大数目的二进制位进行或运算,最后能得到这种情况下的最大饲养数,再减去已有数目就是最后的答案。

但是这样还不够,还被卡时间了,最后换成了printf和scanf才满足了时间要求。

这题最最最可恨的地方就在于踏马的居然有2^64的输出,这个数字就是题设条件下的最大值,而且用ull都输出不了(ull范围恰好是2^64-1),最后还是强行加上这种情况才AC的

最后附上代码~~(不想用devc了,好原始,debug都不方便)

#include<bits/stdc++.h>
using namespace std;
#define  ll long long
ll animal[100],animal_num,rule_num,type_num,sum,all[100];
unsigned ll fast(int x)
{
	unsigned ll r=1,a=2;
	while(x!=0)
	{
		if(x%2==1)
		r=r*a;
		a=a*a;
		x=x/2;
	}
	return r;
}
int main()
{   
	scanf("%lld %lld %lld %lld",&animal_num,&rule_num,&type_num,&sum);
	for(int i=0;i<sum;i++)
	all[i]=1;
	ll temp,final=0;
	for(int i=0;i<animal_num;i++)
	{
		scanf("%lld",&temp);
		final=temp|final;
	}

	ll rule,food;
	for(int i=0;i<rule_num;i++)
	{
		scanf("%lld %lld",&rule,&food);
		all[rule]=0;
	}
	
	
			ll cnt=0;
			while(final!=0)
		{
			if(final%2==1)
			all[cnt]=1;
			cnt++;
			final=final/2;
		}
	ll final_sum=0;
	for(int i=0;i<sum;i++)
	if(all[i]!=0)
	final_sum++;
	unsigned ll sum2=fast(final_sum);
	if(final_sum==64&&animal_num==0)
	printf("18446744073709551616");
	else
	printf("%llu",sum2-animal_num);
	return 0;
}	

我测,看蛊真人看忘了,回过神来快12点半了,明天还有早八,赶紧回来把今天的日记补了。

今天一天过得很充实啊,早上睡到8点,起来开始改程序设计代码,然后上了一节习概,把大物作业写完了。下午一节c++把今天的两道题写了,晚上开了个班会,学了一点github,又给程序设计加了新的功能。

总的来说真的很充实,确实还是不能把时间浪费在线上聊天上,我个人认为没什么营养🥹。

所以明天大物坐前面一点吧,正常听课,然后就是晚上一晚上的程序设计了。还有一点很重要!就是!我!一!定!要!再!去!东边!的!咖啡厅!自习!!😆😆😆

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值