最近不在状态,老是犯一些低级失误,下面罗列一些我的wa点
B 暴力O(kn) 每次找到最大的下标idx和最小的下标idy,idx->idy
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
int n,k,a[102];
vector<pair<int,int> > tmp;
int main(){
cin>>n>>k; k++;
for(int i=1;i<=n;i++)
cin>>a[i];
int ans=1e9,num=0;
while(k--){
int idx=1,idy=1;//x max , y min
for(int i=1;i<=n;i++){
if(a[i]>a[idx]) idx=i;
else if(a[i]<a[idy]) idy=i;
}
//find 0-k op s
if(a[idx]-a[idy]<ans)
ans=a[idx]-a[idy],num=tmp.size();
//the max->min
tmp.push_back(make_pair(idx,idy));
a[idx]--; a[idy]++;
}
printf("%d %d\n",ans,num);
for(int i=0;i<num;i++)
printf("%d %d\n",tmp[i].first,tmp[i].second);
return 0;
}
C 未考虑a.a==b.a的排序情况
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
struct Node{
int a,b;
}t[5002];
int cmp(Node a,Node b){
if(a.a==b.a) return a.b<b.b;//my wa point
return a.a<b.a;
}
int n;
int main(){
cin>>n;
for(int i=0;i<n;i++)
cin>>t[i].a>>t[i].b;
sort(t,t+n,cmp);
int now=0;
for(int i=0;i<n;i++){
if(now>t[i].b)
now=t[i].a;
else now=t[i].b;
}
cout<<now<<endl;
return 0;
}
D 有O(n)的和O(nlgn)的算法 O(nlgn)是使用了map
我是用O(n)渐进查找来做的,不知道咋回事l<=r写成l!=r
前三种情况(放0个,放x,放y)简单,第四种情况又分3种情况
1.存在长度x+y的线段,放在线段的中间
2.存在长度y-x的线段,放在线段的左侧或右侧
3.上述都不存在,放2点
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
const int N=100005;
int n,L,x,y,a[N];
inline void read(int &x){
char ch;x=0;
for(ch=getchar();ch<'0'||ch>'9';ch=getchar());
for(;ch>='0'&&ch<='9';x=x*10+ch-48,ch=getchar());
}
int query(int key){
int l=0,r=1;
while(l<=r&&r<n){// my wa point l!=r
if(a[r]-a[l]==key)
return 1;
else if(a[r]-a[l]>key)
l++;
else r++;
}
return 0;
}
void solve(){
int isX=query(x),isY=query(y);
if(isX&&isY){
printf("0\n"); return;
}
if(isX&&!isY){
printf("1\n%d\n",y); return;
}
if(!isX&&isY){
printf("1\n%d\n",x); return;
}
//假设放p,新的一定跟p有关
int l=0,r=1,key=y+x;
while(l<=r&&r<n){//放中间 a[l] a[l]+x a[r]=a[l]+x+y
if(a[r]-a[l]==key){
printf("1\n%d\n",a[l]+x);//a[l]+y也行
return;
}
else if(a[r]-a[l]>key)
l++;
else r++;
}
l=0,r=1,key=y-x;
while(l<=r&&r<n){
if(a[r]-a[l]==key){
if(a[l]-x>0){//放左边
printf("1\n%d\n",a[l]-x); return;
}
if(a[r]+x<L){//放右边
printf("1\n%d\n",a[r]+x); return;
}
l++;
}
else if(a[r]-a[l]>y-x)
l++;
else r++;
}
printf("2\n%d %d\n",x,y);
}
int main(){
read(n); read(L); read(x); read(y);
for(int i=0;i<n;i++)
read(a[i]);
solve();
return 0;
}
/*
3 100 10 40
0 30 100
1
40
3 513 33 283
0 263 513
1
230
*/