B Views Matter
你来参加展览,一个展览引起了你的注意。它由nn个堆栈组成,其中第ii个堆栈由搁置在表面上的aiai块组成。
展品的高度等于mm。因此,每个堆叠中的块数小于或等于mm。
天花板上有一个摄像头,可以看到积木的顶视图,右侧墙上有一个摄像头,可以看到积木的侧视图。
找到可以删除的最大块数,以便两个摄像机的视图不会更改。
请注意,虽然最初所有的块都堆放在地板上,但是在移除一些块之后,它们不需要保持连接到地板。在整个展览中没有重力,所以即使下面的块被移除,也不会有任何块掉下来。也不允许手动移动块。
输入
第一行包含两个整数nn和mm(1≤n≤100000,1≤m≤10的9次方) - 堆叠的数量和展品的高度。
第二行包含nn个整数a1,a2,...,ana1,a2,...,a(1≤ai≤m) - 每个堆栈中从左到右的块数。
输出
打印恰好一个整数 - 可以删除的最大块数。
示例
输入
5 6
3 3 3 3 3
输出
10
输入
3 5
1 2 4
输出
3
输入
5 5
2 3 1 4 4
输出
9
输入
1 1000
548
输出
0
输入
3 3
3 1 1
输出
1
译文:
乙重要意见
你来参加展览,一个展览引起了你的注意。它由NN个堆栈组成,其中第II个堆栈由搁置在表面上的艾艾块组成。
展品的高度等于毫米。因此,每个堆叠中的块数小于或等于毫米。
天花板上有一个摄像头,可以看到积木的顶视图,右侧墙上有一个摄像头,可以看到积木的侧视图。
找到可以删除的最大块数,以便两个摄像机的视图不会更改。
请注意,虽然最初所有的块都堆放在地板上,但是在移除一些块之后,它们不需要保持连接到地板。在整个展览中没有重力,所以即使下面的块被移除,也不会有任何块掉下来。也不允许手动移动块。
输入
第一行包含两个整数nn和mm(1≤n≤100000,1≤m≤10的9次方) - 堆叠的数量和展品的高度。
第二行包含nn个整数a1,a2,...,ana1,a2,...,a(1≤ai≤m) - 每个堆栈中从左到右的块数。
产量
只打印一个整数 -可以删除的最大块数。
例子
输入
5 6
3 3 3 3 3
产量
10
输入
3 5
1 2 4
产量
3
输入
5 5
2 3 1 4 4
产量
9
输入
1 1000
548
产量
0
输入
3 3
3 1 1
产量
1
#include<stdio.h>
#include<stdlib.h>
int cmp(const void*a,const void*b)
{
return *(int*)a-*(int*)b;//升序
}
int main()
{
int n,m,j,i,k;
scanf("%d %d",&n,&m);
int s[n],sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&s[i]);
sum+=s[i];//总的块数
}
qsort(s,n,sizeof(s[0]),cmp);//快速排序
int max=0,cnt=0;
for(i=0;i<n-1;i++)//探寻前n-1块的最大值
{
if(max<s[i])
{
cnt++;
}
}
int count=n-1;//前n-1列的保留数量;
if(s[n-1]-cnt>1)
{
count+=s[n-1]-cnt;
}
else
{
cnt++;
}
printf("%d\n",sum-cnt);
return 0;
}
这题吧:对我来说是思路的问题,还有一些数据的获取技巧......,关键是连向排序方向想的思想就没有.....