小米全国高校编程大赛 高弗雷勋爵

题目链接:

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_40799464/article/details/84618614