https://ac.nowcoder.com/acm/contest/5773
不平行的线
斜率个数,浮点数比较
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int x[205],y[205];
double l[40010];
int main () {
int n;
scanf("%d",&n);
for (int i=0; i<n; i++)
scanf("%d%d", &x[i], &y[i]);
int cnt=0, ans=0;
for (int i=0; i<n; i++)
for (int j=i; j<n; j++)
if (i!=j) {
if (x[i]!=x[j]) {
l[cnt]=(double)(y[j]-y[i])/(double)(x[j]-x[i]);
cnt++;
}
if (x[i]==x[j]) ans=1;
}
sort(l,l+cnt);
ans+=cnt;
for (int i=1; i<cnt; i++) {
if (fabs(l[i]-l[i-1])<0.0000001) ans--;
}
printf("%d\n",ans);
return 0;
}
交换
对应0-n-1,数闭环
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100005],c[100005];
bool vis[100005];
int main () {
int n;
map<int,int> m;
scanf("%d",&n);
for (int i=0; i<n; i++) {
scanf("%d", &a[i]);
c[i]=a[i];
}
sort(c,c+n);
for (int i=0; i<n; i++) {
m[c[i]]=i;
}
for (int i=0; i<n; i++) {
a[i]=m[a[i]];
}
int cnt=0;
for (int i=0; i<n; i++) {
if (!vis[i]) {
int j=i;
while (!vis[j]) {
vis[j]=true;
j=a[j];
}
cnt++;
}
}
printf("%d\n", n-cnt);
return 0;
}
丢手绢
双指针
i到j没过半圈,i到j+1过,i+1到小于j的都没过,直接比较i+1到j+1,j从1走到n-1扫完
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[100005],b[100005];
int n;
int dis(int i, int j) {
return min(b[j]-b[i],b[n]-b[j]+b[i]);
}
int main () {
scanf("%d",&n);
for (int i=0; i<n; i++) {
scanf("%d",&a[i]);
}
b[0]=0;
for (int i=1; i<=n; i++)
b[i]=b[i-1]+a[i-1];
int ans=0, j=1;
for (int i=0; i<n; i++) {
while (j<n && dis(i,j)<=dis(i,j+1))
j++;
ans=max(ans,dis(i,j));
}
printf("%d\n",ans);
return 0;
}
第k小数
nth_element
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read(){
int x = 0, f = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){
if (ch == '-')
f = -1;
ch = getchar();
}
while(ch >= '0' && ch <= '9'){
x = (x<<1) + (x<<3) + (ch^48);
ch = getchar();
}
return x * f;
}
int a[5000005];
int main () {
int t;
t=read();
while (t--) {
memset(a,0,sizeof(a));
int n,k;
n=read();k=read();
for (int i=0; i<n; i++) a[i]=read();
nth_element(a,a+k,a+n);
printf("%d\n", a[k]);
}
return 0;
}
二分
. 该数+1, +小于该数的都+1, -大于该数的都-1,找max
差分,初始设为0,遍历map求出操作后的每个值并找出其中最大值
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int inf=INT_MAX;
int a[1000005];
char s[1000005];
int main () {
int n;
map<int, int> m;
cin>>n;
for (int i=1; i<=n; i++) {
cin>>a[i]>>s[i];
if(s[i]=='.') {m[a[i]]++; m[a[i]+1]--;}
if(s[i]=='+') {m[a[i]]--; m[-inf]++;}
if(s[i]=='-') {m[inf]--; m[a[i]+1]++;}
}
int ans=-inf,h=0;
for (auto x:m) {
h+=x.second;
ans=max(h,ans);
}
cout<<ans<<endl;
return 0;
}