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;
}
}