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; }
尼古拉最近才开始从事竞争性节目,但已经有资格进入一个著名的奥运会决赛。将会有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; }
首都的郊区正在柏林积极建设。该公司“核心恐慌”管理着新伯尔斯科瓦一座摩天大楼住宅区的建设。所有的摩天大楼都是沿着公路建的。据了解,该公司已经在高速公路沿线购买了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; }