pat乙级1060爱丁顿数
#include<bits/stdc++.h>
#define ll long long
int main( )
{
ll n,result,max=-1;
scanf("%lld",&n);
ll input[n];
for(ll i=0;i<n;i++)
{
scanf("%lld",&input[i]);
max=input[i]>max?input[i]:max;
}
ll hash[max+1],dp[max+1];
for(ll i=0;i<=max;i++) hash[i]=0;
for(ll i=0;i<n;i++) hash[input[i]]++;
dp[max]=hash[max];
//if(dp[max]>=max&&max<=n) {printf("%lld",max);return 0;}
for(ll i=max-1;1;i--)
{
if(i<=0) {result=0;break;}
dp[i]=hash[i]+dp[i+1];
if(dp[i]>=i&&i<=n) {result=i;break;}
else if(dp[i]>=i) {result=n;break;}
}
printf("%lld",result);
return 0;
}
里面我注释的那句话,如果不加就错1个测试用例,如果加了就错4个测试用例.
我的想法是建立一个hash表hash[i]用来存放骑行i公里的天数
再用建立一个dp表,dp[i]表示骑行公里大于等于i的天数
这样很轻松就能得到dp[i]=hash[i]+dp[i+1]
只要i从大到小遍历,找到第一个dp[i]>=i即可找到答案
我写完之后怎么试都是对的,但pta里面的测试用例就总是会错那么几个.有能帮帮我吗