CF #274 (Div. 2) 479B - 479D

最近不在状态,老是犯一些低级失误,下面罗列一些我的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
*/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值