B:
OutputFor each case, firstly you have to print the case number as the form "Case d:", then for the S queries, you calculate if the formula can be satisfied or not. If satisfied, you print "YES", otherwise print "NO".
Sample Input
3 3 3 1 2 3 1 2 3 1 2 3 3 1 4 10Sample Output
Case 1: NO YES NO
C:
6 -45 22 42 -16 -41 -27 56 30 -36 53 -37 77 -36 30 -75 -46 26 -38 -10 62 -32 -54 -6 45Sample Output
5
思路:这两题的想法是一致的,先行将其中的几个数组合并为一个数组,将其排序,然后再循环的选择最后的那个数组的每一个数值,对排好序的数组进行二分判断。
注:在这里B题我碰到了一个问题,
B题代码:
#include <iostream>
#include <algorithm>
using namespace std;
int a[505];
int b[505];
int c[505];
int d[505 * 505];
int main()
{
int L, N, M, S;
int count = 1;
while (scanf("%d%d%d", &L, &N, &M) == 3)
{
for (int i = 0; i < L; i++)
cin >> a[i];
for (int i = 0; i < N; i++)
cin >> b[i];
for (int i = 0; i < M; i++)
cin >> c[i];
int len = 0;
for (int i = 0; i<L; i++)
{
for (int j = 0; j<N; j++)
{
d[len++] = a[i] + b[j];
}
}
sort(d, d + len);
cin >> S;
cout << "Case " << count++ << ":" << endl;
while (S--)
{
int x;
cin >> x;
int flag = 0;
for (int j = 0; j<M; j++)
{
int temp = x - c[j];
int left = 0, right = len - 1;
int mid;
while (left <= right)
{
mid = (left + right) / 2;
if (d[mid]>temp)
{
right = mid - 1;
}
else if (d[mid]<temp)
{
left = mid + 1;
}
else
{
flag = 1;
break;
}
}
if (flag == 1)
break;
}
if (flag == 1)
cout << "YES" << endl;
else
cout << "NO" << endl;
}
}
return 0;
}
C题代码:
#include <iostream>
#include <algorithm>
using namespace std;
int a[4005][5], sum1[4005 * 4005], sum2[4005 * 4005];
int main()
{
int n, mid;
while (~scanf("%d", &n))
{
for (int i = 0; i<n; i++)
{
cin >> a[i][1] >> a[i][2] >> a[i][3] >> a[i][4];
}
int len1 = 0;
int len2 = 0;
for (int i = 0; i<n; i++)
for (int j = 0; j<n; j++)
{
sum1[len1++] = a[i][1] + a[j][2];
sum2[len2++] = a[i][3] + a[j][4];
}
sort(sum2, sum2 + len2);
int count = 0;
for (int i = 0; i<len1; i++)
{
int left = 0;
int right = len2 - 1;
while (left <= right)
{
mid = (left + right) / 2;
if (sum1[i] + sum2[mid] == 0)
{
count++;
for (int j = mid + 1; j<len2; j++)//由于这个数组是允许重复的,所以在找到一个符合题意的数值的时候
{
if (sum1[i] + sum2[j] != 0)
break;
else
count++;
}
for (int j = mid - 1; j >= 0; j--)
{
if (sum1[i] + sum2[j] != 0)
break;
else
count++;
}
break;
}
if (sum1[i] + sum2[mid]<0)
left = mid + 1;
else
right = mid - 1;
}
}
cout << count << endl;
}
return 0;
}