题目链接:
https://code.mi.com/problem/list/view?id=113&cid=2
小米oj给定了输入格式,所以要完全按照他的来,输入字符之后在转换为数字就行了。
这道题注意到数据的大小为1e9,所以直接暴力肯定是会超时的,所以首先排序,之后定义一个累加器,看看前边的数字减为小于等于零时一共减少了个二,然后根据累加器来计算当前数字的值。一直计算到所有的数字小于等于零,输出结果。
代码:
#include <bits/stdc++.h>
using namespace std;
int arr[1000007];
bool compare(int a,int b)
{return a<b;
}
int main()
{
char line[1000007];
memset(arr,0,sizeof(arr));
// 循环读入多行数据
while (cin.getline(line, 1000000))
{
// 处理并输出结果,务必输出换行符
// cout << ans << endl;
memset(arr,0,sizeof(arr));
int k=0;
for(int i=0;line[i]!=0;i++)
{
string str;
int kk=0;
while(line[i]!=32&&line[i]!=0)
{
str[kk++]=line[i];
i++;
}
int o1=1;
for(int i=kk-1;i>=0;i--)
{
int temp=str[i]-'0';
arr[k]+=(temp*o1);
o1*=10;
}
k++;
}
/*
for(int i=0;i<k;i++)
printf("%d ",arr[i]);
*/
sort(arr,arr+k,compare);
int ans=0; //只能是通过相乘的吧。
int thek=0; //用这个来实现个数的统计。
int flag=0; //用于判定是不是可以结束吧。肯定是连续的。是一直连续的。从第二个开始判定
for(int i=0;i<k;i++)
{
if(i!=0)
{
thek++;
}
arr[i]-=(thek*2);
if(arr[i]<=0)
{
if(arr[i]<=-2)
thek--;
continue;
} //直接分类讨论。
if(arr[i]<=2)
{
ans++;
thek++;
continue;
}
if(arr[i]%2==0) //说明是偶数。
{
int index=arr[i]/2;
ans+=index;
thek+=index;
}
else //说明是奇数。两个的。
{
int index=arr[i]/2+1;
ans+=index;
thek+=index;
}
}
cout<<ans<<endl;
}
return 0;
}