Codeforces Round #345 (Div. 2) B. Beautiful Paintings
来源:互联网 发布:知吾者,非君也 编辑:程序博客网 时间:2024/06/07 07:08
There are n pictures delivered for the new exhibition. The i-th painting has beauty ai. We know that a visitor becomes happy every time he passes from a painting to a more beautiful one.
We are allowed to arranged pictures in any order. What is the maximum possible number of times the visitor may become happy while passing all pictures from first to last? In other words, we are allowed to rearrange elements of a in any order. What is the maximum possible number of indices i (1 ≤ i ≤ n - 1), such that ai + 1 > ai.
The first line of the input contains integer n (1 ≤ n ≤ 1000) — the number of painting.
The second line contains the sequence a1, a2, ..., an (1 ≤ ai ≤ 1000), where ai means the beauty of the i-th painting.
Print one integer — the maximum possible number of neighbouring pairs, such that ai + 1 > ai, after the optimal rearrangement.
520 30 10 50 40
4
4200 100 100 200
2
In the first sample, the optimal order is: 10, 20, 30, 40, 50.
In the second sample, the optimal order is: 100, 200, 100, 200.
题意:给出一个初始的序列,叫你判断这个序列重新排号之后最多有多少个前一个小于后一个的数目.
思路:先统计出每个相同的数各有多少个,然后每次都从1-1000扫一遍,看有多少个不同的数cnt同时每个数的数目减一,每次答案加上cnt-1.(即相当于每次求最长上升子序列)
#include<bits/stdc++.h>using namespace std;const int INF=0x3f3f3f3f;const int maxn=1100;int cnt[maxn],a[maxn];int main(){ int n; while(scanf("%d",&n)!=EOF){ memset(cnt,0,sizeof(cnt)); for(int i=1;i<=n;i++){ scanf("%d",&a[i]); cnt[a[i]]++; } int ans=0; for(int i=1;;i++){ int count=0; for(int j=1;j<=1000;j++){ if(cnt[j]>=1) count++,cnt[j]--; } if(count<=1) break; ans+=count-1; } printf("%d\n",ans); } return 0;}
可以变形为ai<=1e9
//对a[i]<=1e9的时候的代码#include<bits/stdc++.h>using namespace std;const int maxn=1010;multiset<int>st;int a[maxn],b[maxn];int DP(int n){ b[1]=a[1]; int len=1; for(int i=2;i<=n;i++){ if(a[i]>b[len]) len=len+1,b[len]=a[i]; else{ int pos=lower_bound(b+1,b+len+1,a[i])-b; b[pos]=a[i]; } } return len;}int main(){ int n,x; scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&x); st.insert(x); } int ans=0; multiset<int>::iterator it; for(int i=1;i<=n;i++){ int cnt=0; for(it=st.begin();it!=st.end();it++) a[++cnt]=(*it); if(cnt<=0) break; int len=DP(cnt); if(len<=1) break; for(int i=1;i<=len;i++){ it=st.lower_bound(b[i]); st.erase(it); } ans+=(len-1); } printf("%d\n",ans); return 0;}
- Codeforces Round #345 (Div. 2) B. Beautiful Paintings
- Codeforces Round #345 (Div. 2)-B. Beautiful Paintings(暴力)
- Codeforces Round #345 (Div. 2) B. Beautiful Paintings【贪心】
- Codeforces Round #345 (Div. 2) B. Beautiful Paintings
- codeforces #345 div.2 B Beautiful Paintings
- Codeforces Round #345 (Div. 2)——B. Beautiful Paintings(贪心求上升序列个数)
- Codeforces Round #345 (Div. 2) B. Beautiful Paintings __ greedy and Bucket_sort
- 【Codeforces Round 345 (Div 2) B】【贪心 STL-set】Beautiful Paintings 安排顺序使得a[i]大于a[i-1]的i尽可能多
- codeforces--651B Beautiful Paintings
- codeforces 651B Beautiful Paintings
- CodeForces 651B Beautiful Paintings
- codeforces 651B Beautiful Paintings
- CodeForces 651B Beautiful Paintings
- 【CodeForces】651B - Beautiful Paintings
- 【CodeForces】[651B]Beautiful Paintings
- CodeForces 651B Beautiful Paintings
- CodeForces 651B Beautiful Paintings
- Codeforces 651B Beautiful Paintings
- ABAP改表狂魔程序
- 浅谈php构造方法与构析方法
- 关于批量插入数据之我见(100万级别的数据,mysql)
- Oracle 11g服务器监听配置
- Redis架设好了,.net接口也到位,怎么用,先看看Redis应用场景
- Codeforces Round #345 (Div. 2) B. Beautiful Paintings
- Activity生命周期的分析
- Java中初始化基础类
- 【主席树】CF650D
- G
- windows常用命令
- SDAU 贪心专题 07 赛跑问题
- 安卓开发eclipse无线调试
- PHP PSR-1 基本代码规范(中文版)