题意:给定两组数,求能不能从每组中各找出一个数使其和为10000。第一组数递增,第二组数递减,这两组数据可能有重复数字
思路:遍历第二组数,在第一组中进行二分查找,找到便结束
输入:
4
-175
19
19
10424
3
8951
-424
-788
输出:
YES
#include <stdio.h>
#include <string.h>
#define N 50005
int s[N],len,n,m;
int find(int x){
int high,low,mid;
low = 1;
high = len;
while(low <= high){
mid = (low+high)/2;
if(s[mid] == x)
return mid;
else if(s[mid] > x)
high = mid-1;
else
low = mid+1;
}
return 0;
}
int main(){
freopen("a.txt","r",stdin);
while(scanf("%d",&n)!=EOF){
int i,temp,flag=0;
s[0] = 32768;
len = 0;
for(i = 1;i<=n;i++){
scanf("%d",&temp);
if(temp != s[len])
s[++len] = temp;
}
scanf("%d",&m);
for(i = 0;i<m;i++){
scanf("%d",&temp);
if(!flag && find(10000-temp))
flag = 1;
}
if(flag)
printf("YES\n");
else
printf("NO\n");
}
return 0;
}
1840:
题意:给定ai(1<=i<=5),求a1x1^3+ a2x2^3+ a3x3^3+ a4x4^3+ a5x5^3=0的解。规定:xi∈[-50,50], xi != 0, any i∈{1,2,3,4,5}.
思路:对于x1,x2,x3,打表列出之后排序,然后对x4,x5暴力二分查找。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <string>
#include <map>
#include <cstdlib>
using namespace std;
#define clc(s,t) memset(s,t,sizeof(s))
#define N 1000005
int hh[N],len;
int t(int x){
return x*x*x;
}
int main(){
int i,j,k,a,b,c,d,e,res;
len = res = 0;
scanf("%d %d %d %d %d",&a,&b,&c,&d,&e);
for(i = -50;i<=50;i++){
if(!i)
continue;
for(j = -50;j<=50;j++){
if(!j)
continue;
for(k = -50;k<=50;k++)
if(k)
hh[len++] = a*t(i)+b*t(j)+c*t(k);
}
}
sort(hh,hh+len);
for(i = -50;i<=50;i++){
if(!i)
continue;
for(j = -50;j<=50;j++){
if(j){
k = d*t(i)+e*t(j);
res += upper_bound(hh, hh+len, -k) - lower_bound(hh, hh+len, -k);
}
}
}
printf("%d\n",res);
return 0;
}