题意:给定两组数,求能不能从每组中各找出一个数使其和为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; }