hdu 2141 Can you find it? hdu1597 find the nth digit
生活随笔
收集整理的這篇文章主要介紹了
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;
}
?
轉載于:https://www.cnblogs.com/nanke/archive/2011/08/02/2125248.html
總結
以上是生活随笔為你收集整理的hdu 2141 Can you find it? hdu1597 find the nth digit的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 坚守基本的职业信仰
- 下一篇: Apache自带的ab压力测试工具