zoukankan      html  css  js  c++  java
  • hdu 2141 Can you find it? && hdu1597 find the nth digit

    hdu2141

    唉,是我 想多了,用普通方法拼命剪枝,还是TLE

    直接将前俩个数组的和求出来并保存,之后就是一个二分查找的过程了

    二分的俩种写法

    第一种 
    #include<iostream>
    #include<algorithm>
    #include<string>
    using namespace std;
    int a[501],b[501],c[501],f[250001];
    bool bin_search(int n,int key)
    {
    int left=0,right=n-1,mid=0,temp;
    while(left<right)
    {
    temp=mid;
    mid=(left+right)/2;
    if(f[mid]==key)
    return true;
    if(f[mid]<key)
    left=mid;
    else right=mid;
    if(temp==mid)
    return false;
    }
    return false;
    }
    int main()
    {
    int cas=0,n,m,l;
    while(scanf("%d %d %d",&n,&m,&l)==3)
    {
    for(int i=0;i<n;i++)
    scanf("%d",&a[i]);
    for(int i=0;i<m;i++)
    scanf("%d",&b[i]);
    for(int i=0;i<l;i++)
    scanf("%d",&c[i]);
    int ss=0;
    for(int i=0;i<n;i++)
    for(int j=0;j<m;j++)
    f[ss++]=a[i]+b[j];
    sort(f,f+ss);
    int q;
    scanf("%d",&q);
    printf("Case %d:\n",++cas);
    while(q--)
    {
    int x;
    scanf("%d",&x);
    int flag=0;
    for(int i=0;i<l;i++)
    {
    if(bin_search(n*m,x-c[i]))
    {
    flag=1;
    break;
    }
    }
    if(flag)
    printf("YES\n");
    else printf("NO\n");
    }
    }
    return 0;
    }
    第二种
    #include<iostream>
    #include<math.h>
    #include<algorithm>
    using namespace std;
    int a[501],b[501],c[501],f[250001];;
    int L,M,N;
    int cmp(const void *a1,const void *a2)
    {
    return *(int*)a1-*(int *)a2;
    }
    int binsearch(int *d,int n,int key)
    {
    int mid,front=0,back=n-1;
    while(front<=back)
    {
    mid=(front+back)/2;
    if(d[mid]==key) return 1;
    if(d[mid]<key) front=mid+1;
    else back=mid-1;
    }
    return 0;
    }
    void input()
    {
    for(int i=0;i<L;i++)
    scanf("%d",&a[i]);
    for(int i=0;i<M;i++)
    scanf("%d",&b[i]);
    for(int i=0;i<N;i++)
    scanf("%d",&c[i]);
    int s=0;
    for(int i=0;i<L;i++)
    for(int j=0;j<M;j++)
    f[s++]=a[i]+b[j];
    qsort(f,s,sizeof(f[0]),cmp);
    }
    int main()
    {
    int cas=0,n;
    while(cin>>L>>M>>N)
    {
    input();
    cin>>n;
    int x;
    cout<<"Case "<<++cas<<":"<<endl;
    while(n--)
    {
    cin>>x;
    int flag=0;
    for(int i=0;i<N;i++)
    {
    if(binsearch(f,N*M,x-c[i]))
    {
    flag=1;
    break;}
    }
    if(flag) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
    }
    }
    return 0;
    }

     hdu1597

    中文题,题意就不说了;

    先用一个数组a[i],表示拼接了i个串之后串s的长度

    之后,对于任意的N,先二分找出长度为N时前面是由几个串拼接成的,这样再取下模,答案就出来了

    View Code
    #include<iostream>
    #include<algorithm>
    using namespace std;
    //65535
    int a[66000],k;
    void init()
    {
    a[0]=0;
    int i;
    for(i=1;;i++)
    {
    if(a[i-1]>=INT_MAX-i)
    break;
    a[i]=a[i-1]+i;
    }
    a[i]=INT_MAX;
    k=i+1;
    }
    int Bin_search(int key)
    {
    int left=1,right=k,mid;
    while(left<=right)
    {
    mid=(left+right)/2;
    if(a[mid]<=key && a[mid+1]>key)
    return mid;
    else if(a[mid]<key)
    left=mid+1;
    else right=mid-1;
    }
    return k;
    }
    int main()
    {
    int T;
    init();
    scanf("%d",&T);
    while(T--)
    {
    int n;
    scanf("%d",&n);
    int t=Bin_search(n);
    int ans=n-a[t];
    if(ans==0)
    ans=a[t]-a[t-1];
    if(ans%9==0)
    printf("9\n");
    else printf("%d\n",ans%9);
    }
    return 0;
    }
  • 相关阅读:
    Linux下一个patch补丁命令
    资本中国人物-金融
    深入浅出JMS(一)——JMS简要
    在JBuilder8在使用ANT
    mysql存储引擎
    Linux系统监控
    SIEM
    mysql主从数据库复制
    JVM中可生成的最大Thread数量
    磁盘IO性能监控(Linux 和 Windows)
  • 原文地址:https://www.cnblogs.com/nanke/p/2125248.html
Copyright © 2011-2022 走看看