五月的第一次考试——2018/05/13

这又是一个漫长的大周。于是,可亲可爱的老师,在放假的三天里给我们考了两次试。所以……Raiting是唰唰的掉啊。我掉了三儿啊。最近的考试都是四个小时六道题,题有点多,但是总是会有一道送分题。


Day1——

题目描述(简略版):判断一个数P是不是另一个正整数的三次方。是的话输出“YES”,否则输出“NO”

其实第一题挺水的,但是,但是我怎么就不会呢。

于是考试过后,听了小越越的讲解,我终于沉痛的明白,这是一道水题。

看到这道题,第一反应:wow这么简单?当然不是的喽,因为我看见了输入格式,哼哼,这是一道多组数据的题。看到多组数据,我自然而然地想到了福州的ZLD同志。总之,多组数据就是很难骗分。再然后,这道题的P还是very big 的,有10^18 (虽然后面证明它就算是10^18也不会超时)。
但是,这道题并不是所有数都是这么大,于是,我就骗了一点部分分。也就是先算出从1到106里所有的立方数,然后再输入P看它是否是106范围内的立方数。但是,我怕他超时,只循环到10000。

代码如下

#include<bits/stdc++.h>
using namespace std;
long long a[10010];
int t,p,x=0;
void hh()
{
	for (int i=1;i<=10000;i++) a[++x]=i*i*i;
} 
int main()
{
	cin>>t;
	long long s;
	hh();
	for (int i=1;i<=t;i++)
	{
		bool pp=false;
		cin>>p;
		for (int j=1;j<=x;j++)
		  if (p==a[j]) pp=true;
		if (pp) cout<<"YES"<<endl;
		else cout<<"NO"<<endl;
	}
	return 0;
}

但是,这个只有60分(我10^4 居然拿到了10^6的分)

其实,你并不用计算出范围内的立方数。只需要在输入P以后枚举i的立方,在判断是否等于P。因为P是10^18 ,所以它的立方就是10^6 内,而T刚好是100,于是刚刚好卡着10^8,不会超时。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	long long p;
	cin>>t;
	for (long long i=1;i<=t;i++)
	{
		bool pp=true;
		cin>>p;
		for (long long j=1;j<=1000000;j++)
		  if (j*j*j==p)
		  {
		    cout<<"YES"<<endl;
			pp=false;
			break;
		  }
		if (pp) cout<<"NO"<<endl;
	}
	return 0;
}

所以这样就可以AC了。


第二题——立方数2

所以这题也很水,只要在第一题的基础上只需要改一丢丢就可以AC的题。但是,一丢丢改在哪里也是一个问题。

题目描述:还是一个多组数据的题,需要你判断P是否能写成两个数的立方差的格式。P是一个质数。

其实,质数只能拆成两个连续正整数的立方差。
所以,只要在第一题的if 条件改动一下
所以代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int t;
	long long p;
	cin>>t;
	for (int i=1;i<=t;i++)
	{
		bool pp=true;
		cin>>p;
		for (long long j=1;j<=1000000;j++)
		  if (j*j*j-(j-1)*(j-1)*(j-1)==p) 
		  {
		    cout<<"YES"<<endl;
			pp=false;
		  }
		if (pp) cout<<"NO"<<endl;
	}
	return 0;
}

还有3~5,没什么好讲的,因为我到现在都没有Ac。

最后,到了第六题

我们在寒假开学前就做过原题,也是考试。然后,我还是华丽丽不会做。但是,我肯定我做过。但是但是但是,我还是不会。
其实这道题真的很 very 的easy。

sum记录的是左括号的个数,如果是左括号,那么sum++,如果是右括号,则需要判断左括号是否为零,如果不是零,只需要与左括号匹配,也就是sum–。如果sum==0,那么这个右括号就需要改为左括号,因为没有左括号可以匹配了,所以ans++,同时sum++。

代码如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
	string s;
	int sum=0,ans=0;
	cin>>s;
	for (int i=0;i<s.size();i++)
	{
		if (s[i]=='(') sum++;
		else if(sum>0) sum--;
		else
		{
			ans++;
			sum++;
		}
	}
	ans+=sum/2;
	cout<<ans<<endl;
	return 0; 
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值