약 교 련 맹 11 대 결전 의 강력 한 몸 풀기 B Carries 2 점 + 시 뮬 레이 션 진입

1846 단어
제목: 클릭 하여 링크 열기
10 ^ 5 개 두 개 를 더 해서 몇 자리 가 들 어 갔 는 지 물 어보 세 요.O (n * n) 의 알고리즘 을 생각하면 시간 이 현저히 초과 되 고 모든 사람의 중복 계산 으로 인 한 시간 초과 도 계산 하지 않 아야 합 니 다 = =
AC 코드 를 보고 upper 를 사용 합 니 다.bound 는 아직 2 점 이 떠 오 르 지 않 았 다 →→ 코드 를 보 는 것 도 어렵 지 않 은 데 생각 이 안 나 네요.
결론 적 인 방법: 예전 에 자신 이 계속 고민 하고 자리 에 들 어간 후에 비교적 높 은 운행 결과 에 영향 을 줄 수 있 으 며 진 위 를 모 의 하려 면 반드시 현재 위치 라 는 두 개의 0 ~ 9 숫자 를 더 해 야 한다 고 주장 했다.
그러나 사실은 자줏빛 T ^ T 를 더 할 때 현재 위치 와 아래 의 이 숫자 를 더 하면 상술 한 문 제 를 해결 할 수 있 는 것 이 아니다. 한 자리 씩 더 하면 반드시 높 은 정밀 도 를 모 의 해 야 하 는 것 은 아니다.
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define N 100005
int a[N],b[N],ans,n;
long long total;
int main()
{
  //  freopen("cin.txt","r",stdin);
    while(~scanf("%d",&n))
    {
        int maxn=0;
        for(int i=0;i<n;i++)
        {
            scanf("%d",&a[i]);
            if(maxn<a[i]) maxn=a[i];
        }
        ans=1,total=0;
        for(int i=0;i<9;i++)
        {
            ans*=10;
            for(int j=0;j<n;j++) b[j]=a[j]%ans;
            sort(b,b+n);
            for(int j=0;j<n-1;j++)
            {
                int l=j+1,r=n-1,id=-1;
                if(b[j]+b[n-1]<ans) continue;
                while(l<=r)
                {
                    int mid=(l+r)>>1;
                    if(b[j]+b[mid]>=ans) {
                        r=mid-1;
                        id=mid;
                    }
                    else l=mid+1;
                }
                total+=(n-id);
              //  printf("%d
",total); } if(ans>maxn) break; } printf("%lld

",total); } return 0; }
p. s. 7 일간 의 제목 은 따로 분 류 했 는데 도 간장 을 치 는 구나 아아

좋은 웹페이지 즐겨찾기