第二专题训练

思路:从两端查找,不断缩小范围,同时做上标记。
题目:
1.#include
using namespace std;
int n,q;
int a[100100];
int main(void)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
scanf("%d",&q);
for(int i=1;i<=q;i++)
{
int j;
scanf("%d",&j);
int l=1,r=n;
while(1)
{
if(lr)
break;
int temp=(l+r)/2;
if(a[temp]>j)
r=temp;
else if
(a[temp]
j)break;
else
l=temp+1;
}
if(a[(l+r)/2]==j)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
2.#include

include<unordered_set>

include

include

include<unordered_map>

include<string.h>

include

include

using namespace std;
int t;
unordered_map<int, int>m;
vectorv;
int main(void) {
int n, c;
cin >> n >> c;
for (int i = 1; i <= n; i++) {
int a;
scanf("%d", &a);
if (!m.count(a)) {
v.push_back(a);
m.insert({ a,1 });
}
else
m[a]++;
}
sort(v.begin(), v.end());
long long i = 0, j = 0, ans = 0;
while (i < v.size()) {
if (v[i] - v[j] < c)
i++;
else if (v[i] - v[j] == c)
ans += (long long)m[v[i++]] * m[v[j]];
else
j++;
}
cout << ans;
return 0;
}
3.#include
using namespace std;
long long n, k, h[200100], w[200100];
bool chk(long long m)
{
long long sum = 0;
for (int i = 1; i <= n; i++)
sum += (h[i] / m) * (w[i] / m);
if (k > sum)
return false;
else
return true;
}
int main(void)
{
cin >> n >> k;
for (int i = 1; i <= n; i++)
scanf("%lld%lld", &h[i], &w[i]);
long long l = 0, r = 100100000000;
while (1) {
if (l == r)
break;
long long mid = (l + r) / 2;
if (chk(mid))
l = mid + 1;
else
r = mid;
}
if (chk(l))
cout << l;
else
cout << l - 1;
return 0;
}
4.#include
using namespace std;
long long n, m;
long long a[200100], b[200100];
bool chk(long long k) {
long long sum = 0;
for (int i = 1; i <= n; i++) {
if (a[i] + b[i] >= k)
sum += max(k - a[i], (long long)0);
else
return false;
}
if (sum > m)
return false;
else
return true;
}
int main(void) {
cin >> n >> m;
for (int i = 1; i <= n; i++)
scanf("%lld", &a[i]);
for (int i = 1; i <= n; i++)
scanf("%lld", &b[i]);
long long l = 0, r = 100100000000;
while (1) {
if (l == r)
break;
long long mid = (l + r) / 2;
if (chk(mid))
l = mid + 1;
else
r = mid;
}
if (chk(l))
cout << l;
else
cout << l - 1;
return 0;
}
总结:有点难,但是主要是对半,标记的思想。

posted @ 2025-01-26 21:17  jidemimi  阅读(9)  评论(0)    收藏  举报