Jeanny
寂兮,寥兮,独立不改,周行而不殆

1.13 03:矩形分割
枚举:

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int R,n,lx,ly,w,h,s[1000005],a[1000005],loc;
signed main(){
	scanf("%lld%lld",&R,&n);
	for(int i=1;i<=n;i++){
		scanf("%lld%lld%lld%lld",&lx,&ly,&w,&h);
		for(int j=lx+1;j<=lx+w;j++)
			a[j] += h;
	}
	for(int i=1;i<=R;i++)
		s[i]=a[i]+s[i-1];
	for(int i = 0; i <= R; i++){
		if(s[i] >= s[R]- s[i]){
			loc = i;
			break;
		}
	}
	int i;
	for(i = loc+1; i <= R; i++){
		if(s[i] != s[i-1]){
			printf("%lld",i-1); 
			return 0;
		}		
	}
	if(i-1 == R) printf("%d\n",R);
	else printf("%d\n",loc);
	return 0;	
}
/*
1000 2
0 1 2 1
1 2 1 1
注意答案:2

1000 1
0 1 1 1
注意答案:1000

*/

二分:

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int R,n,lx,ly,w,h,s[1000005],a[1000005],loc;
signed main(){
	scanf("%lld%lld",&R,&n);
	for(int i=1;i<=n;i++){
		scanf("%lld%lld%lld%lld",&lx,&ly,&w,&h);
		for(int j=lx+1;j<=lx+w;j++)
			a[j] += h;
	}
	for(int i=1;i<=R;i++)
		s[i]=a[i]+s[i-1];
	int l = 0, r = R;
	while(l < r){
		int mid = (l+r)/2;
		if(s[mid] < s[R] - s[mid]) l = mid+1;
		else r = mid;
	}
//	cout<<"l: "<<l<<endl;
	int i;
	for(i = l+1; i <= R; i++){
		if(s[i] != s[i-1]){
			printf("%lld",i-1); 
			return 0;
		}		
	}
	printf("%lld\n",R);
	return 0;	
}
/*
3 2
0 1 2 1
1 2 1 1
注意答案:? 2?3

1000 1
0 1 1 1
注意答案:1000

*/

1.11 01:查找最接近的元素
5分的原因是,如果两边相同,则输出小的

#include <bits/stdc++.h>
using namespace std;
int a[100005],p,q;
int main() {
	int n, m;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	cin >> m;
	
	for (int i = 1; i <= m; i++) {
		int x; cin >> x;
		int low = 1, high = n, mid ;
		while (low < high) {
			mid = (low + high) / 2;
			if (a[mid] > x) {
				high = mid;
			} else {
				low = mid + 1;
			}
		}
		p = low;
		int f = abs(a[low] - x);
		low = 1, high = n;
		while (low < high) {
			mid = (low + high + 1) / 2;
			if (a[mid] <= x) {
				low = mid;
			} else {
				high = mid - 1;
			}
		}
		q = low;
		int w = abs(x - a[low]);
		if (w <= f) {
			cout << a[q] << endl;
		}
		else {
			cout << a[p] << endl;
		}
	}
	return 0;
}

1.11 08:不重复地输出数

#include<bits/stdc++.h>
using namespace std;
int n,a[100005];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	sort(a+1,a+1+n);
	cout<<a[1]<<' ';
	int i = 1;
	while(i <= n){
		int l=i+1,r=n+1;
		while(l<r){
			int mid=(l+r)/2;
			if(a[mid]>a[i])r=mid;
			else l=mid+1;
		}
		if(l == n+1) break;
		else
			cout<<a[l]<<" ";
		i = l;
	}	
	return 0;
}

P1571 眼红的Medusa
P1918 保龄球 题解
二分

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
struct Node{int g,w;};
bool cmp(Node x,Node y){
	return x.g<y.g;
}
Node a[100005];
int n,m,x,r,l,mid;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i].g);
		a[i].w=i;
	}
	sort(a+1,a+1+n,cmp);
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		scanf("%d",&x);
		l=0, r=n+1;
		while(l<r){
			mid=(r+l)/2;
			if(a[mid].g<x) l=mid+1;
			else r=mid;
		}
		if(a[r].g!=x) printf("0\n");
		else printf("%d\n",a[r].w);
	}
    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;
    }
}
posted on 2022-01-25 16:24  Jeanny  阅读(97)  评论(0)    收藏  举报