1.输出数组中大于等于 l 且小于等于 r 的元素个数
法一:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
cin>>n>>m;
vector<int>q(n);
for(int i=0;i<n;i++){
scanf("%d",&q[i]);
}
sort(q.begin(),q.end());
while(m--){
int l,r;
cin>>l>>r;
int left=0,right=n-1;
while(left<right){
int mid=right+left>>1;
if(q[mid]>=l) right=mid;
else left=mid+1;
}
int res1=left;
left=0,right=n-1;
while(left<right){
int mid=(left+right+1)/2;//防止陷入死循环
if(q[mid]<=r) left=mid;
else right=mid-1;
}
int res2=right;
cout<<res2-res1+1<<endl;
}
return 0;
}
法二:
#include<bits/stdc++.h>
using namespace std;
int n,q,l,r;
int main()
{
cin>>n>>q;
vector<int>arr(n);
for(int i=0;i<n;i++)
cin>>arr[i];
std::sort(arr.begin(),arr.end());
while(q--)
{
cin>>l>>r;
auto left=lower_bound(arr.begin(),arr.end(),l);
auto right=upper_bound(arr.begin(),arr.end(),r);
cout<<right-left<<endl;
}
return 0;
}
lower_bound:查找第一次大于等于l的 元素位置
upper_bound:查找第一次大于r的元素位置
2.音符
法一:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,q;
cin >> n >> q;
vector<int> a(n+1,0);
vector<int> c(n+1,0);
for(int i=1; i<=n; i++)
{
cin >> a[i];
c[i] = c[i-1] + a[i];
}
while(q--)
{
int b;
cin >> b;
int l = 1, r = n;
while(l < r)
{
int mid = (l + r ) >> 1;
if(c[mid] > b) r = mid;
else l = mid+1;
}
int tmp = l;
cout << tmp << endl;
}
return 0;
}
法二:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,q;
cin >> n >> q;
vector<int> a(n+1,0);
vector<int> c(n+1,0);
for(int i=1; i<=n; i++)
{
cin >> a[i];
c[i] = c[i-1] + a[i];
}
while(q--)
{
int b;
cin >> b;
auto it = upper_bound(c.begin()+1, c.end(), b);
int tmp = it - c.begin();
cout << tmp << endl;
}
return 0;
}
3.洛谷p1918保龄球
法一:二分递归
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,a,ans;
struct E{
ll h,H;
}N[100005];
bool cmp(E x,E y)
{
return x.h<y.h;
}
bool pd(ll A,ll l,ll r)
{
ll mid=(l+r)/2;
if(N[mid].h==A)
{
ans=N[mid].H;
return true;
}
if(l>r)return false;
if(A<=N[mid].h)return pd(A,l,mid-1);
else return pd(A,mid+1,r);
}
int main()
{
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>N[i].h;
N[i].H=i;
}
sort(N+1,N+1+n,cmp);
cin>>m;
for(ll i=1;i<=m;i++)
{
cin>>a;
if(pd(a,1,n))
{
cout<<ans<<endl;
}
else cout<<0<<endl;
}
return 0;
}
法二:二分循环
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,m,a,ans;
struct E{
ll h,H;
}N[100005];
bool cmp(E x,E y)
{
return x.h<y.h;
}
ll pd(ll tar,ll l,ll r)
{
while(l <= r){
ll mid=(l+r)/2;
if(N[mid].h==tar)
{
ans=N[mid].H;
return ans;
}
if(N[mid].h < tar) l = mid+1;
if(N[mid].h > tar) r = mid-1;
}
return -1;
}
int main()
{
cin>>n;
for(ll i=1;i<=n;i++)
{
cin>>N[i].h;
N[i].H=i;
}
sort(N+1,N+1+n,cmp);
cin>>m;
for(ll i=1;i<=m;i++)
{
cin>>a;
ll tmp = pd(a,1,n);
if(tmp == -1) cout << 0 << endl;
else cout<< tmp <<endl;
}
return 0;
}
法三:map+暴力
#include<map>
#include<iostream>
using namespace std;
map<int,int>ma;
int n,a,q,m;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a;
ma[a]=i;
}
cin>>q;
for(int i=1;i<=q;i++){
cin>>m;
cout<<ma[m]<<endl;
}
}
4.洛谷P1163
#include <bits/stdc++.h>
#define up(l,r,i) for(int i=l;i<=r;i++)
#define dn(l,r,i) for(int i=r; i>=l;i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
double n, m, s, ans;
int k;
int right(double u){
double sum = 0, v = 1;
up(1,k,i){
v *= (1+u);
sum += (m/v);
}
if(sum == n) return 0;
if(sum > n) return 1;
else return -1;
}
int main()
{
IOS;
cin >> n >> m >> k;
double l=0, r=800, mid;
while(r-l >= 0.0001){
mid = (l+r) / 2;
if(!right(mid)) break;
if(right(mid) == 1) l = mid;
else r = mid;
}
printf("%.1lf", mid*100);
return 0;
}
5.洛谷P2678
#include <bits/stdc++.h>
#define up(l,r,i) for(int i=l;i<=r;i++)
#define dn(l,r,i) for(int i=r; i>=l;i--)
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
const int MAXN = 50001;
int stone[MAXN], a, n, m;
bool check(int d){
int p=0, ans=0;
up(1,n,i){
if(stone[i] - p < d) ans++;
else p = stone[i];
}
if(ans <= m) return true;
else return false;
}
int main()
{
IOS;
cin >> a >> n >> m;
up(1,n,i) cin >> stone[i];
stone[++n] = a;
int l = 0, r = a, mid;
while(l < r){
mid = (l+r+1) / 2;
if(check(mid)) l = mid;
else r = mid - 1;
}
cout << l ;
return 0;
}
6.洛谷p1024
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define int long long
#define up(l,r,i) for(int i=l; i<=r; ++i)
using namespace std;
double a, b, c, d;
double fc(double x)
{
return a*x*x*x+b*x*x+c*x+d;
}
signed main()
{
IOS;
double l,r,m,x1,x2;
int s = 0, i;
cin >> a >> b >> c >> d;
up(-100,99,i){
l = i;
r = i+1;
x1 = fc(l);
x2 = fc(r);
if(!x1)
{
printf("%.2lf ",l);
s++;
}
if(x1 * x2 < 0)
{
while(r-l >= 0.001)
{
m = (l+r) / 2;
if(fc(m)*fc(r) <= 0)l=m;
else r=m;
}
printf("%.2lf ",r);
s++;
}
if(s == 3) break;
}
return 0;
}