五月下

这大周考了两次试两次都很炸。(当然我水平也就这点)都是倒数三四名,我的rating是全部人的倒数第三。好忧伤啊,每次都会掉个十三、四名……唉。

第一次考试我就第一题得了30分,第四题得了20分就没了。

第一题:给n,求n是否是立方数。这题我是想先把1~x为底数的立方数求出来,再在这些数中找有没有和n相等的。但一个一个循环找很麻烦,还会超时。越越教我了这题的正解,因为总共最多有100个数要判断,每个数是10^18,开三次方是10^6。10^6*100刚好卡在不超时的范围内。so直接暴力枚举就好了。好吧我有一点无奈……这就好了:

#include<bits/stdc++.h>

using namespace std;
int main()
{
int t;
long long p;
cin>>t;
for(int i=1;i<=t;i++)
{
   bool l=1;
cin>>p;
for(long long j=1;j<=1000000;j++)
if(j*j*j==p)
{
cout<<"YES"<<endl;
l=0;
break;

if(l) cout<<"NO"<<endl; 
}
return 0;

}

第二题:给出n,求n是不是两个立方数的差。我当时看到题都蒙了,这咋做啊。好吧就是因式分解就是a^3-b^3,并且n是质数,所以n=a^3-b^3=(a-b)(a^2+ab+b^2)=((b+1)^2+(b+1)b+b^2)=3b^2+3b+1=3*b(b+1)+1。所以接下来暴力枚举就OK了。

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

if(l) cout<<"NO"<<endl; 
}
return 0;

}

(第三题还不会……)

第四题:是传说中的水题,就是要前几副牌最多能覆盖后几副牌。我是想爆力打的就是找能覆盖后面牌的最小的牌。我觉我的思路没错但不知道哪错了。

#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,l=0,a[110000],b[110000];
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i]>>b[i];
for(int i=1;i<=n;i++) 
{
int x,y,s=0,p=11000,q=11000,c=0;
cin>>x>>y;
for(int j=1;j<=n;j++)
{
if(a[j]>=x&&b[j]>=y) 
if(a[j]-x<=p && b[j]-y<=q)
{
p=a[j]-x; q=b[j]-y; c=j;

}
a[c]=0; b[c]=0; 
if(c!=0) l++;
}
cout<<l<<endl;
}我觉得要错的话应该是 if(a[j]-x<=p && b[j]-y<=q) 这一句条件严格了但我不知道怎么改。


猜你喜欢

转载自blog.csdn.net/wangzhuojia/article/details/80323421