#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,可以用)
我的代码:
题意: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; }
相关文章推荐
- 2015BJOI day1第二题 树的同构family
- Codeforces Round #197 (Div. 2)
- Codeforces Round #198 (Div. 1)
- Codeforces 405E Codeforces Round #238 (Div. 2)E
- Codeforces 407C Codeforces Round #239 (Div. 1)C
- CodeForces 449A - Jzzhu and Chocolate
- CodeForces 449 B. Jzzhu and Cities
- codeforces 618C. Constellation
- Codeforces Round #265 (Div. 2)
- Codeforces #310 div2 C. Case of Matryoshkas
- 状态压缩DP codeforces 244 Problem C. The Brand New Function 和 codeforces 165 E. Compatible Numbers
- codeforces 16 Problem E fish
- Codeforces Round332 部分题解
- CodeForces 603A_Alternative Thinking (DP)
- CodeForces 602B_Approximating a Constant Range_DP
- Codeforces round #247 for Div. 2
- Codeforces Round #246 (Div. 2)
- Codeforces #264(div 2)D.Gargari and Permutations
- Codeforces Round #236 (Div. 2)------A,B
- codeforces 257 div2 B