您的位置:首页 > 其它

AtCoder Regular Contest 086

2017-12-10 22:26 411 查看
蒻苣的题解……

C Not so Diverse

题意:给定有n个数的数组A,求最少对其中的多少个元素重新赋值使数组中最多有k个不同的数?

1≤K≤N≤200000

1≤Ai≤N

分析:计数排序,O(logn+n) ~ O(n)

#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(a,n) memset(a,n,sizeof(a))
typedef long long ll;
const int N=2e5+5;
int cnt
;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,k;
while(~scanf("%d%d",&n,&k))
{
int x;
mem(cnt,0);
for(int i=0;i<n;i++)
{
scanf("%d",&x);
cnt[x]++;
}
sort(cnt,cnt+N,cmp);
int ans=0;
for(int i=k;cnt[i];i++) ans+=cnt[i];
printf("%d\n",ans);
}
return 0;
}


D - Non-decreasing

题意:给定有n个元素的数组(下标从1开始),可以对[1,n]的选定x,y,可以Ay+=Ax 任意次操作,求m次操作使数组为非递减数列(m在[0,2*n]内认为是正确的),接下来m行输出每次的x,y

分析:显然,spj

找到绝对值最大的元素。。 乱搞。。

记录绝对值最大的元素的位置,将此元素加到其他元素上,然后根据之前的绝对值最大的元素的符号进行操作。。

#include <bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
#define mem(a,n) memset(a,n,sizeof(a))
typedef long long ll;
const int N=50+5;
int main()
{
int n,pos,mx,tmp,flag;
while(~scanf("%d",&n))
{
pos=1,mx=0;
for(int i=1;i<=n;i++)
{
scanf("%d",&tmp);
if(abs(tmp)>mx) mx=abs(tmp),pos=i,flag=(tmp<0)?1:0;
}
printf("%d\n",2*n-2);
for(int i=1;i<=n;i++)
if(i!=pos) printf("%d %d\n",pos,i);
if(flag)
for(int i=n;i>1;i--)
printf("%d %d\n",i,i-1);
else
for(int i=2;i<=n;i++)
printf("%d %d\n",i-1,i);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  atcoder