99网
您的当前位置:首页Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) A B C D

Codeforces Round #681 (Div. 2, based on VK Cup 2019-2020 - Final) A B C D

来源:99网

A. Kids Seating
题意:
要求理想的座位数之间不为1且不能相互整除
座位直接从4*n开始每次递减2倒序输出满足为2且不会互相整除

int main()
{
	int t=read();
	while(t--){
		int n=read();
		for(int i=4*n;i>2*n;i-=2){
			cout<<i<<" ";
		}
		cout<<endl;
	}
	return 0;
}

B. Saving the City
题意:
1为此处有0则没有,每次引爆可以使得相邻俩位置的引爆以此类推,有俩操作:
1)花费a引爆
2)花费b在此处埋一个
求最后花费最少使得所有的都引爆
思路:
贪心,多组分解为相邻俩之间需要埋和直接引爆的花费最小值

char ch[100010];
 
int main() {
    int t=read();
    while(t--) {
        int a=read();
        int b=read();
        int ans=0,pos=-1;
        cin>>ch;
        int len=strlen(ch);
        for(int i=0; i<len; i++) {
            if(ch[i]=='1') {
                if(pos!=-1&&(i-pos-1)*b<a) {
                    ans+=(i-pos-1)*b;
                } else ans+=a;
                while(i<len&&ch[i]=='1') i++;
                pos=i-1;
            }
        }
        cout<<ans<<endl;
    }
    return 0;
}

C. The Delivery Dilemma
思路:
a对结果的贡献看最大值,b对结果的贡献看累计的最大值
贪心对a递增排序,b记录前缀和
最后on对当前位置判断a和b剩余的和的最大值
对结果min更新

struct node {
    ll a;
    ll b;
} no[200010];
bool ccmp(node a,node b) {
    return a.a<b.a;
}
ll sum[200010];
 
int main() {
    int t=read();
    while(t--) {
        int n=read();
        for(int i=1; i<=n; i++) {
            no[i].a=read();
        }
        for(int i=1; i<=n; i++) {
            no[i].b=read();
        }
        sort(no+1,no+1+n,ccmp);
        sum[0]=0;
        for(int i=1; i<=n; i++) {
            sum[i]=no[i].b+sum[i-1];
        }
        ll ans=sum[n];
        for(int i=1; i<=n; i++) {
            ans=min(ans,max(sum[n]-sum[i],no[i].a));
        }
        cout<<ans<<endl;
    }
    return 0;
}

D. Extreme Subtraction
思路:
差分,记录负值和的值判断是否大于a[1]输出yes否则输出no

int a[30010];
int cf[30010];
int main() {
    int t=read();
    while(t--) {
        int n=read();
        a[0]=0;
        for(int i=1; i<=n; i++) {
            a[i]=read();
            cf[i]=a[i]-a[i-1];
        }
        int ans=0;
        for(int i=2; i<=n; i++) {
            if(cf[i]<0) ans=ans+(-1)*cf[i];
        }
        if(ans<=a[1]) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}

因篇幅问题不能全部显示,请点此查看更多更全内容