您的位置:首页 > 大数据 > 人工智能

#345 Div2 B. Beautiful Paintings

2016-03-14 23:21 465 查看
第一次在CSDN上写博客,纪念一下。

题意:1<=N<=1000大小的1<=ai<=1000的数组,最多有多少对满足a(i+1)>ai;即严格上升的顺序

链接:http://codeforces.com/contest/651/problem/B

这道题 virtual 的时候过了,不过做这道题用的时间用了比较久,手速慢。赛完后看了一下帆神的代码,竟然辣么短,而且不理解什么意思,百度了一下其他题解才弄明白

我的方法:每次循环都产生出一个严格上升的序列,把序列的长度加到答案上,然后把此序列中的数在原序列中删除,重复操作遍历原数列所有数后的ans即最优解,最坏的时间复杂度O(n^2*logn)(循环n次,每次快排n*logn)

更好的方法:上述方法中每次找到第K个严格上升的序列加到遍历过的K-1序列之后的ans就是(n-1)-K,因为每次生成一个序列就和前面的序列断开了一个,一共有n-1个间隔,所以最优解即找到max(数组中出现次数最多的数出现的次数),然后(n-1)-max即可,复杂度为O(n*logn)(快排之后做)或者O(n)(开数组num[a]记录数字a出现的次数,当a的范围过大时会超内存而不适用,此题a<=1000,可以用)

我的代码:

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>

using namespace std;

int n;
int cnt;
int ma[1010];
int ans;

int cmp(const void*a,const void*b){
return *(int*)b-*(int*)a;
}

int main()
{
int i,j;
int tmp;
int flag;
while(~scanf("%d",&n)){
memset(ma,0,sizeof(ma));
for(i=1;i<=n;i++){
scanf("%d",&ma[i]);
}
ans=0;cnt=n;
while(cnt>0){
qsort(ma+1,n,sizeof(ma[0]),cmp);
tmp=0;
flag=-1;
for(i=1;i<cnt;i++){
if(ma[i]!=ma[i+1]){
tmp++;
ma[i]=0;
flag=i+1;
}
else
;
}
if(flag!=-1)
ma[flag]=0;
ans+=tmp;
cnt-=tmp+1;
}
printf("%d\n",ans);
}
return 0;
}
O(n*logn)代码

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#define N 100010
using namespace std;
int a
;
int n;
int main()
{
int i;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
int ans=0,tmp=0;
for(i=1;i<=n;i++)
{
while(i<=n&&a[i]==a[i-1])
{ans++;i++;}
tmp=max(tmp,ans);
ans=0;
}
ans=n-1-tmp;
printf("%d\n",ans);

return 0;
}
O(n)代码

#include <cmath>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 1005
inline int mini(int a, int b)
{
return a < b ? a : b;
}
inline int maxi(int a, int b)
{
return a > b ? a : b;
}
int num[maxn];
int main()
{
int n, t, m = -1, ans = 0;
scanf("%d", &n);
for (int i = 0; i < n; ++i)
{
scanf("%d", &t);
num[t]++;
}
for (int i = 1; i < maxn; ++i)
m = maxi(m, num[i]);
ans = n - m;
printf("%d\n", ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  乱搞 codeforces