91分萌新求救(就第十个点过不去)(大哭
查看原帖
91分萌新求救(就第十个点过不去)(大哭
181715
gjh303987897楼主2022/10/18 20:30
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>

using std:: endl;
using std:: cout;
using std:: cin;

int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch<='9'&&ch>='0'){
        x=(x<<3)+(x<<1)+(ch^48);
        ch=getchar();
    }
    return x*f;
}

const int maxn = 1011;
const int ADD = maxn*8;
int a[maxn],b[maxn];
int num[maxn];
int f[1000001];

int main(){
    int n=read();
    int sum = 0;
    for(int i=1;i<=n;i++){
        a[i]=read(); b[i]=read();
        num[i]=a[i]*2-b[i]*2;
        sum+=a[i]-b[i];
        //    cout<<" "<<i<<": "<<num[i]<<" ";
    }
    //    cout<<endl<<"sum: "<<sum<<endl;
    for(int i=0;i<=maxn*10+ADD;i++) f[i]=1000001;
    f[ADD+sum]=0;
    for(int i=1;i<=n;i++){
        for(int j=maxn*7+ADD;j>=ADD-maxn*7;j--){
            f[j]=std:: min(f[j],f[j+num[i]]+1);
        }
    }
    int search=0;
    while(true){
        if(f[search+ADD]<1000001||f[ADD-search]<1000001){
            cout<<std:: min(f[ADD+search],f[ADD-search]);
            break;
        }
        search++;
    }
    return 0;
}
2022/10/18 20:30
加载中...