此题还有一个测试点没过
https://pintia.cn/problem-sets/994805260223102976/problems/994805291311284224
两个坑:
1,用long防止溢出两个10的九次方相乘会溢出。
2.运行超时问题要判断。我这个判断不行。
要用第二个代码,首先将输入的数字进行sort排序,从小到大。
然后设定i,j记录符合的数组位置,count记录符合要求的中间数字
的多少,初始为0,i从0~n,j从i+count开始,找到符合要求的j
时(M≤mp),计算j-i+1与count的大小,比count大就进行更新。
下一次计算时,j直接从i+count开始,因为必然要满足统计
的j-i+1要大于count才会记录,因此这里很巧妙,避免了还
从j=i+1开始计算。最后输出count。
注意p是10^9,因此用int存储不了,直接都用long int比较好。
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long int n=0,p=0;
scanf("%lld %lld",&n,&p);
int a[n];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
long long int num=0;//存储最小值*p
int cnt=0;//记录出现的次数
int max=0;//形成完美数列最多可选择的数
for(int i=0;i<n;i++)
{
cnt=0;
num=a[i]*p;//不改long long这里会出错
int j=i;
for(j;a[j]<=num && j<=n-1 && max<n-i+1;j++)
{
cnt++;
}
if(cnt>max)
{
max=cnt;
}
}
printf("%d",max);
}
//PAT1030V1
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;
int main(){
double p;
int n,i,j,count=0;
scanf("%d %lf",&n,&p);
double a[n];
for(i=0;i<n;i++)
scanf("%lf",&a[i]);
sort(a,a+n);
for(i=0;i<n;i++){ //遍历,将a[i]作为最小值
for(j=i+count;j<n;j++){ //j为要满足可以更新数列长度的值,减少循环次数
if(a[j]>a[i]*p)
break;
if(j-i+1>count)
count=j-i+1;
}
}
printf("%d",count);
return 0;
}
参照代码二,修改我的
#include<bits/stdc++.h>
using namespace std;
int main()
{
long long int n=0,p=0;
scanf("%lld %lld",&n,&p);
int a[n];
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(a,a+n);
long long int num=0;//存储最小值*p
int cnt=0;//记录出现的次数
int max=0;//形成完美数列最多可选择的数
for(int i=0;i<n;i++)
{
for(int j=i+cnt;j<n;j++)
{
if(a[j]>a[i]*p)
break;
if(j-i+1>cnt)
cnt=j-i+1;
}
// cnt=0;
// num=a[i]*p;//不改long long这里会出错
// int j=i+cnt;
// for(j;a[j]<=num && j<=n-1 && max<n-i+1;j++)
// {
// cnt++;
// }
// if(cnt>max)
// {
// max=cnt;
// }
}
printf("%d",cnt);
}
PAT乙级—1030 完美数列(运行超时)
最新推荐文章于 2022-04-26 18:03:06 发布