Codeforces补题2020.3.1 (Round622 Div2)

A.Fast Food Restaurant

厌倦了无聊的办公室工作,丹尼斯决定开一家快餐店。

第一天,他用炼乳包了一份饺子、一份酸梅汁和一份煎饼。

丹尼斯餐馆的特点是点餐的程序。丹尼斯自己为每位来访者挑选了一套客人将要接受的菜肴。这样做时,丹尼斯遵循以下规则:

每位游客至少应得到一道菜(饺子、酸梅汁、炼乳煎饼都被视为菜肴);

每位游客最多可获赠一份饺子、一份蔓越莓汁和一份加炼乳的煎饼;

所有来访者都应得到不同的菜肴。

丹尼斯最多能接待多少访客?

输入

第一行包含整数t(1≤t≤500)-要解决的测试用例数。

其余的每一个t行包含整数a、b和c(0≤a、b、c≤10)-饺子的份数、蔓越莓汁的份数和丹尼斯做的炼乳煎饼的份数。

输出

对于每个测试用例,打印一个整数-丹尼斯可以提供的最大访客数。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1014;
int T;
int a,b,c;
int main () {
    scanf("%d",&T);
    while (T--) {
        scanf("%d%d%d",&a,&b,&c);
        if (a<b) swap(a,b);
        if (a<c) swap(a,c);
        if (b<c) swap(b,c);
        int ans=0;
        if (a) ans++,a--;
        if (b) ans++,b--;
        if (c) ans++,c--;
        if (a&&b) ans++,a--,b--;
        if (a&&c) ans++,a--,c--;
        if (b&&c) ans++,b--,c--;
        if (a&&b&&c) ans++,a--,b--,c--;
        printf ("%d
",ans);
    }
    return 0;
} 
View Code

B.Different Rules

尼古拉最近才开始从事竞争性节目,但已经有资格进入一个著名的奥运会决赛。将会有n个参与者,其中一个是尼古拉。像任何好的奥林匹克运动会一样,它由两轮组成。厌倦了传统规则,解决最多问题的参与者获胜,组织者想出了不同的规则。

假设在第一轮中,参与者A排在第x位,在第二轮中,参与者A排在第y位。那么参与者A的总分是x+y之和。参与者A的总分是参与者(包括A)的总数,其总分小于或等于A的总分。注意,一些参与者可能最终会有一个共同的总分。同样重要的是要注意,在第一轮和第二轮中,没有两名参与者在同一个地点打成平手。换言之,从1到n的每一个i中,恰好有一个参与者在第一轮中获得了第i名,正好有一个参与者在第二轮中获得了第i名。

奥运会刚结束,尼古拉就被告知他在第一轮获得了第x名,在第二轮获得了第y名。尼古拉不知道其他参与者的结果,但他想知道,如果我们考虑到对他最有利和最不利的结果,他能占据的最小和最大位置是什么。请帮助尼古拉找到这个问题的答案。

输入

第一行包含整数t(1≤t≤100)-要解决的测试用例数。

下面的每一行都包含整数n,x,y(1≤n≤109,1≤x,y≤n)-奥林匹克运动会的参赛人数,尼古拉第一轮和第二轮的参赛地点。

输出

打印两个整数-最小和最大可能的整体位置尼古拉可以。

#include<bits/stdc++.h>
using namespace std;
int T;
int N,x,y;
int main () {
    scanf("%d",&T);
    while (T--) {
        scanf("%d%d%d",&N,&x,&y);
        printf("%d %d
",min(N,max(1,x+y-N+1)),min(N,x+y-1));
    }
    return 0;
}
View Code

C.Skyscrapers

首都的郊区正在柏林积极建设。该公司“核心恐慌”管理着新伯尔斯科瓦一座摩天大楼住宅区的建设。所有的摩天大楼都是沿着公路建的。据了解,该公司已经在高速公路沿线购买了n块地,并准备建造n座摩天大楼,每块地一座摩天大楼。

建筑师在规划摩天大楼时必须考虑几个要求。首先,由于每个地块上的土地都有不同的属性,因此每个摩天大楼的最大楼层数都有限制。其次,根据城市设计规范,一座摩天大楼的左右两侧同时拥有更高的摩天大楼是不可接受的。

从形式上讲,让我们把图从1数到n,然后如果第i个图上的摩天大楼有ai层,它必须保持ai最多为mi(1≤ai≤mi)。也不能有整数j和k,这样j<i<k和aj>ai<ak。图j和k不要求与i相邻。

该公司希望已建成的摩天大楼的总层数尽可能大。帮助其以最佳方式为每个摩天大楼选择层数,即以满足所有要求的方式,并在所有此类施工计划中选择具有最大可能总层数的任何计划。

输入

第一行包含一个整数n(1≤n≤1000)-绘图数。

第二行包含整数m1,m2,…,mn(1≤mi≤109)-每个地块上摩天大楼每可能楼层数的楼层数限制。

输出

打印n个整数ai-每个摩天大楼的平面图中的楼层数,以便满足所有要求,并且所有摩天大楼的总楼层数是最大可能的。

如果可能有多个答案,请打印其中任何一个。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e6+14;
ll a[maxn];
ll l[maxn];
ll r[maxn];
int main () {
    int N;
    while (~scanf("%d",&N)) {
        stack<int> st;
        for (int i=1;i<=N;i++) scanf("%d",&a[i]);
        for (int i=1;i<=N;i++) {
            while (!st.empty()&&a[st.top()]>=a[i])
                st.pop();
            if (st.empty()) l[i]=i*a[i];
            else l[i]=l[st.top()]+(i-st.top())*a[i];
            st.push(i);
        }
        while (!st.empty()) st.pop();
        for (int i=N;i>=1;i--) {
            while (!st.empty()&&a[st.top()]>=a[i])
                st.pop();
            if (st.empty()) r[i]=(N-i+1)*a[i];
            else r[i]=r[st.top()]+(st.top()-i)*a[i];
            st.push(i);
        }
        ll ans=0;
        ll id=0;
        for (int i=1;i<=N;i++) {
            ll tmp=l[i]+r[i]-a[i];
            if (tmp>ans) {
                ans=tmp;
                id=i;
            }
        }
        for (int i=id-1;i>=1;i--) a[i]=min(a[i],a[i+1]);
        for (int i=id+1;i<=N;i++) a[i]=min(a[i],a[i-1]);
        for (int i=1;i<=N;i++) printf ("%d ",a[i]);
        printf ("
");
    }
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/zhanglichen/p/12390063.html