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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值