今年六一的礼物——5.31考试总结

眼看六一儿童节(我的节日)就要来了,我们可(wu)亲(shi)可(ke)敬(zuo)的刘岳两神,非常善(xie)良(e)地决定出血本送我们六一儿童节的美好礼物,嗯哼,于是就有了5.31上午的考试。吼吼吼。

 

考完试,按惯例,我就应该非(bu)常(qing)及(bu)时(yuan)地写一篇内容丰(pin)富(ji)的总结

 

第一题……emmm,依旧很水,就是定义lucky的六位数(手动@zyt)为前三位数码和与后三位数码和相等的六位数,然后给定一个n,找一个比他大的最小的lucky的六位数,没有就输出-1

 

用我的脑壳想了一哈,就知道999999是最大的lucky数,那么当且仅当输入999999是,输出-1

 

嗯哼,然后我就定义了一个 bool 型函数,判断一个数是不是 lucky 数,然后从 n+1 一直到 999999 遍历一遍就行,一有就输出,结束,反正很多数都蛮 lucky

inline bool lucky(int k)
{
	int sum1=0,sum2=0,ans=0;
	while(k>0)
	{
		ans++;
		int a=k%10;
		k/=10;
		if(ans<=3) sum1+=a;
		else sum2+=a;
	}
	if(sum1==sum2) return 1;
	return 0;
}
int main()
{
	scanf("%d",&n);
	if(n==999999)
	{
		cout<<"-1"<<endl;
		return 0;
	}
	for(int i=n+1;;i++)
	{
		if(lucky(i))
		{
			cout<<i<<endl;
			break;
		}
	}
	return 0;
}

然后第二题,一点都不水(至少我这个vegetable chicken)这样认为,吼吼吼

题目描述

         有两个数组A,B,大小均为N。请在A中选择一个数xB中选择一个数y,使得gcd(x,y)最大;如果有多组数gcd相同,找出x+y最大的。

格式                        

         输入:第一行一个数n,第二行n个数表示Ai,第三行n个数表示Bi

         输出:输出gcd最大的那对数(gcd相同则和最大)的x+y的值。

最暴力肯定就是暴搜然后依次求gcd然后比较嘛,很明显会超时。考试的时候忘了辗转相除求gcd怎么写,导致gcd函数也用了很长时间

所以,辗转相除是很重要的

ll gcd(ll m,ll n)
{
    return m%n? gcd(n,m%n):n;
}

亲测用我的shabi gcd有18‘,换上这个gcd就有24’,嗯哼,虽然还是不是很高。
下面正解
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
int n,maxx=0,x;
bool a[maxn],b[maxn];

inline int read()
{
	int x=0,w=0;
	char ch=0;
	while(!isdigit(ch))	{w|=ch=='-';ch=getchar();}
	while(isdigit(ch))	{x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return w? -x:x;
}

int main()
{
	n=read();
	for(int i=1;i<=n;i++)
	{
		x=read();
		a[x]=1;
		maxx=max(maxx,x);
	}
	for(int i=1;i<=n;i++)
	{
		x=read();
		b[x]=1;
		maxx=max(maxx,x);
	}
	for(int i=maxx;i>=1;i--)
	{
		int xx=0,yy=0;
		for(int j=1;j*i<=maxx;j++)
		{
			if(a[i*j])	xx=i*j;
			if(b[i*j])	yy=i*j;
		}
		if(xx&&yy) {printf("%d",xx+yy);return 0;}
	}
	printf("1");
	return 0;
}

然后第三题,老师又双叒叕皮了,嘿嘿嘿

蓝月商场有n件宝贝,每件宝贝有两个属性:价钱price和品牌brand。其中brand1-5之间某个整数。每件宝贝价钱两两不同。

       贪玩蓝月有Q个代言人,每个代言人拍完戏之后,希望能从蓝月商场免费顺走一样宝贝。但是每个代言人有自己的喜好,例如古天乐只喜欢品牌1,陈小春喜欢品牌1或品牌2,渣渣辉喜欢品牌35……具体来说,代言人会有d个喜欢的品牌(1 <= d <= 5),同时他最喜欢这些品牌中,价钱k便宜的宝贝。

       请你求出每个代言人最喜欢的宝贝的价钱是多少!如果不存在这件宝贝,请输出-1.

格式

       输入:第一行一个整数n,第二行n个整数描述每件宝贝的品牌,第三行n个数描述每件宝贝的价钱。第四行一个整数Q,接下来Q*3行,每3行描述一个代言人的信息。其中第一行一个整数d,第二行d个数表示喜欢的品牌,第三行一个数表示k

       输出:一共 Q 行,每行一个数。
这题打了个暴力,50‘,happy

其实正解和我想得也差不多
#include<bits/stdc++.h>
using namespace std;
const int maxn=100100;
int n,q,m,k,b[10],s1[maxn],s2[maxn],s3[maxn],s4[maxn],s5[maxn];
struct fj
{
	int brand,price;
}a[100010];

inline bool cmp(fj a,fj b)	{return (a.price<b.price);}

inline int get(int x)
{
	int ret=0;
	for(int i=1;i<=m;i++)
	{
		if(b[i]==1)	ret+=s1[x];
		if(b[i]==2)	ret+=s2[x];
		if(b[i]==3)	ret+=s3[x];
		if(b[i]==4)	ret+=s4[x];
		if(b[i]==5)	ret+=s5[x];
	}
	return ret;
}

inline int read()
{
	int x = 0,w = 0;
	char ch = 0;
	while(!isdigit(ch))	{w|=ch=='-';ch=getchar();}
	while(isdigit(ch))	{x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
	return w?-x:x;
}

int main()
{
	n=read();
	for(int i=1;i<=n;i++)	a[i].brand=read();
	for(int i=1;i<=n;i++)	a[i].price=read();
	sort(a+1,a+1+n,cmp);
	for(int i=1;i<=n;i++)
	{
		if(a[i].brand==1)	s1[i]=s1[i-1]+1;else s1[i]=s1[i-1];
		if(a[i].brand==2)	s2[i]=s2[i-1]+1;else s2[i]=s2[i-1];
		if(a[i].brand==3)	s3[i]=s3[i-1]+1;else s3[i]=s3[i-1];
		if(a[i].brand==4)	s4[i]=s4[i-1]+1;else s4[i]=s4[i-1];
		if(a[i].brand==5)	s5[i]=s5[i-1]+1;else s5[i]=s5[i-1];
	}
	q=read();
	for(int i=1;i<=q;i++)
	{
		m=read();
		for(int i=1;i<=m;i++)
		b[i]=read();
		k=read();
		if(get(n)<k)
		{
			cout<<"-1"<<endl;
			continue;
		}
		int l=1,r=n;
		int mid;
		while(l<=r)
		{
			mid=(l+r)>>1;
			if(get(mid)>=k) r=mid-1;
			else l=mid+1;
		}
		cout<<a[l].price<<endl;
	}
	return 0;
}

 
 

那就先写这三题吧,毕竟后三题我还不会/手动泪奔
最后,祝我六一儿童节快乐快乐快乐快乐快乐快乐快乐快乐

考试可以考得不好,儿童节不能不过,吼吼吼





猜你喜欢

转载自blog.csdn.net/luoyin_2021/article/details/80522862