先把刷题网站放在这里吧~题库 - 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;
}
第二题,动物园,题目好勾八长,但是最后读下来其实不复杂,饲料种类一点用都没有,实际上就是按照题目给的最大的数目,求出对应的二进制,然后如果这个进制位有饲料要求,就把他设为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,又给程序设计加了新的功能。
总的来说真的很充实,确实还是不能把时间浪费在线上聊天上,我个人认为没什么营养🥹。
所以明天大物坐前面一点吧,正常听课,然后就是晚上一晚上的程序设计了。还有一点很重要!就是!我!一!定!要!再!去!东边!的!咖啡厅!自习!!😆😆😆