新生赛部分题目总结

我直接进行一个质数的操作

Description

质数是指在大于 1 的自然数中,除了 1 和它本身以外不再有其他因数的自然数。

邓老师非常喜欢质数,现在他给出一个定义 f(x) ,表示严格大于 x 的最小质数,例如, f(1)=2,f(2)=3,f(3)=f(4)=5。并且 ⌊x⌋⌊x⌋ 表示不大于 x 的最大整数。

现在邓老师想考考你,总共给出 m次询问,每次询问给出一个正整数x。

如果 g(x)为质数,输出”YES”,如果 g(x)g不是质数,输出”NO”。

g(x)=⌊(f(x)+f(f(x)))/2⌋

Input

第一行输入给出一个整数 m(1≤m≤105) ,表示总询问次数;

接下来 m 行,每行单独给出一个正整数x(1≤x≤1018) 。

Output

共 m 行,如果 g(x)是质数,输出“YES“,如果 g(x)不是质数,输出”NO”。(不带双引号)

这个题最开始用的最原始的方法,调用判断质数的函数,然后一直超时,通过运行测试以及在纸上演草,发现了规律其实就是除一外的所有数字输出都是No,然后ac

电阻

Description

询问要得出一个电阻值为a/b​的元件至少需要多少个电阻值为1的电阻。

元件由3种方式组成:

1. 一个电阻

2. 一个元件与一个电阻串联

3. 一个元件与一个电阻并联

Input

一行两个数a和 b表示询问元件的阻值为a/b

数据规模与约定

1≤a,b≤1018

Output

一行一个数ans,表示最少需要的电阻数

第一次代码

#include <stdio.h>

int f( int a, int b )
{
	if( a == 0 || b == 0 )
		return 0;
		if(a==b&&a!=0)
		return 1;

	if( a > b )
		return f( a % b, b ) + a / b;

	if( a < b )
		return f( a, b % a ) + b / a;
}

int main()
{
    int a, b;

    scanf( "%d %d", &a, &b );

	int n = f( a, b );
	printf("%d", n);
}

使用了递归的思想,但是没有优化,所以产生了超时的错误

ac代码

#include <stdio.h>
long long f( long long a, long long b )
{
	if( a == 0 || b == 0 )
		return 0;
	if(a==b!=0)
	return 1;

	if( a > b )
		return f( a % b, b ) + a / b;

	if( a < b )
		return f( a, b % a ) + b / a;
}

int main()
{
    long long  a, b;

    scanf( "%lld %lld", &a, &b );

long long n = f( a, b );
	printf( "%lld", n );
}

f(n)=a/b,如果a>b,则f(n)=1+f(n-1)=a/b => f(n-1)=(a-b)/b,如果a-b>b,即a>2b,则f(n-1)=1+f(n-2)=(a-b)/b => f(n-2)=(a-2b)/b,……,设k=a/b,则f(n)=f(n-k)+(a-kb)/b=>f(n)=f(n-k)+a/b

f(n)=a/b,当a<b时,f(n)=1*f(n-1)/(1+f(n-1)) => f(n-1)=a/(b-a),当a<b-a,即2a<b时,f(n-1)=1*f(n-2)/(1+f(n-2)) => f(n-2)=a/(b-2a),……,设k=b/a,则f(n)=f(n-k)+a/(b-ka),即f(n)=f(n-k)+b/a

优化了递归,ac

燃涛过河

Description

燃子和涛学长有一天相约去动物园,想去看国家保护动物穿山甲,但是进入穿山甲园区前要经过一条很长很宽的河流,吝啬的动物园园长不愿意雇佣船夫,他只提供了一条可以容纳两个人的小船,小船每次过河都需要一人将船划回,燃子和涛学长之前有n个游客,每个人划船过河需要的时间是ki​,(当两个人一起过河时,所需要的时间是两个人过河时间中的较大值)

因为燃子和涛学长是今天的最后两个游客,而且给了园长一碗鸡汤,所以园长额外给他们提供了一条船,来满足他们两个想要一起过河的愿望。请你计算所有游客(包括燃子和涛涛学长)过河所需要的最短时间,题目保证n个游客不需要燃子和涛学长也可以全部过河,且n个游客之间的顺序可以调换。

Input

第一行是一个整数 T(1≤T≤100) ,代表测试数据的组数。

每个测试数据输入包含两行:

第一行包含 3 个整数 a,b,n,表示燃子和涛学长的过河时间以及前面排队的人数;

第二行包含 nn个整数 k1​,k2​,k3​,⋯,kn−1​,kn​ 表示 n个人每个人的过河时间。

数据规模与约定

1≤n≤1000

1≤a,b,ki​≤100

Output

输出只有一行:输出 m

这道题当时的思路其实有一部分是对的,即将先用qsort排好序后,分四种情况讨论,第一种,只有一个人,返回这一个人时间,第二种,两个人,返回时间长的那个,即t【1】,第三种,三个人,返回   t[ 0 ] + t[ 1 ] + t[ 2 ],第四种,四个人及以上,又分两种情况,

while(n>=4)
{
if(2*t[0]+t[n-1]+t【n-2]<2*t[1]+t[0]+t[n-1]) //比较两种过河模式 
sum += 2*t[0]+t[n-1]+t[n-2];
else
sum += 2*t[1]+t[0]+t[n-1];
n-=2; //每次计算最慢的两个人的过河时间 
}
 

四种情况再加上a与b中的最大值,即可得出最终结果。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值