Sicily2015

参考自:http://blog.csdn.net/lyhvoyage/article/details/12239757

// Problem#: 2015
// Submission#: 2527950
// The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License
// URI: http://creativecommons.org/licenses/by-nc-sa/3.0/
// All Copyright reserved by Informatic Lab of Sun Yat-sen University
#include <iostream>
#include <cstdio>
using namespace std;

int main()
{
    int n,m;
    while (1)
    {
        scanf("%d",&n);
        if (!n)
            break;
        int i;
        int A[1005];
        for (i=0;i<=n-1;i++)
            scanf("%d",&A[i]);
        scanf("%d",&m);

        if (n<m)
            printf("0\n");
        else
        {
            int left=0,right=2000000,ans=0;
            while (left<=right)
            {
                int sum=0;
                int mid=(left+right)/2;
                for (i=0;i<=n-1;i++)
                    if (A[i]>mid)
                        sum+=mid;
                    else
                        sum+=A[i];
                if (sum>=mid*m)
                {
                    ans=mid;
                    left=mid+1;
                }
                else
                    right=mid-1;
            }
            printf("%d\n",ans);
        }
    }
    return 0;
}                                 

自己直接模拟写了一个,一直TLE,按理说题目数据不大应该不会TLE,可能是哪里死循环了。。查半天查不出来。

思路是先排序,每次都取出最小数目的一个珠子以及最大数目的m-1个珠子,若取后顺序有所改变则重新排序,直到无法再取。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int main()
{
    int m,n;
    int A[1005];
    while (1)
    {
        scanf("%d",&n);
        if (!n)
            break;
        int i;
        for (i=0;i<=n-1;i++)
            scanf("%d",&A[i]);
        scanf("%d",&m);

        sort(A,A+n);
        int pos=0;
        int ans=0;
        if (m<=n)
        {
            while (1)
            {
                if (A[n-m]==A[n-m+1])
                {
                    while (A[pos]==0)
                        pos++;
                    if (pos>n-m)
                        break;
                    for (i=n-m+1;i<=n-1;i++)
                        A[i]--;
                    ans++;
                    A[pos]--;
                    sort(A+pos,A+n);
                }
                else if (A[n-m+1]-A[n-m]<A[pos])
                {
                    for (i=n-m+1;i<=n-1;i++)
                        A[i]-=A[n-m+1]-A[n-m];
                    ans+=A[n-m+1]-A[n-m];
                    A[pos]-=A[n-m+1]-A[n-m];
                    sort(A+pos,A+n);
                }
                else
                {
                    while (A[pos]==0)
                        pos++;
                    if (pos>n-m)
                        break;
                    for (i=n-m+1;i<=n-1;i++)
                        A[i]-=A[pos];
                    ans+=A[pos];
                    A[pos]=0;
                }
            }
        }
        printf("%d\n",ans);
    }
  return 0;
}


你可能感兴趣的:(Sicily2015)