应该是dp的题,但是瞎搞了一个不是dp的也过了orz
总之先记一下,一会儿再来把dp的正解补充上……
#include<cstdio>//AC
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=999999;
struct Node{
int pos;
int cnt;
}a[maxn];
int cmp(Node a,Node b)
{
return a.cnt>b.cnt;
}
int main(void)
{
int n;
while(scanf("%d",&n)!=EOF)
{
int ans=-1;
for(int i=0;i<n;i++)
{
int temp;
scanf("%d",&temp);
a[temp].cnt++;
a[temp].pos=temp;
if(a[temp].cnt>=(n+1)/2)
{
ans=temp;
}
}
if(ans==-1)
{
sort(a,a+n,cmp);
printf("%d\n",a[0].pos);
}else{
printf("%d\n",ans);
}
}
return 0;
}
这个是参照 https://blog.csdn.net/ltrbless/article/details/81318935 这篇的题解写的,网上这个题的题解看了好几篇,但是感觉都不能算是dp的思想,只有这篇是按照dp的大问题分小问题这样搞的。
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=999999;
int a[maxn];
int dp[maxn];
int main(void)
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
int i=0;
int j=1;
while(j<n)
{
if(dp[i]==1)
{
while(dp[i]==1)
{
i++;
}
}
if(a[i]!=a[j])
{
i++;
dp[j++]=1;
}else{
while(a[i]==a[j])
{
j++;
}
}
}
while(dp[i]==1) i++;
printf("%d\n",a[i]);
}
return 0;
}