Codeforces Round #622 (Div. 2)

A:

题意:

有ABC的三种菜,现在有a个A,b个B,c个C,问能组成多少种不同菜单

思路:

abc都大于等于4,肯定是7种,给abc排个序,从大到小举例删减

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define inf 0x3f3f3f3f
 7 #define lowbit(x) (x)&(-x)
 8 #define mem(a,b) memset(a,b,sizeof(a))
 9 #define modd 998244353
10 const int maxn=1e5+10;
11 int n,m,t;
12 bool cmp(int a,int b){
13     return a>b;
14 }
15 int main(){
16     scanf("%d",&t);
17     while(t--){
18         int a[3];
19         scanf("%d%d%d",&a[0],&a[1],&a[2]);
20         sort(a,a+3,cmp);
21         if(a[0]>=4 && a[1]>=4 &&a[2]>=4){printf("7\n");}
22         else{
23             int ans=0;
24             if(a[0]>0){a[0]--;ans++;}
25             if(a[1]>0){a[1]--;ans++;}
26             if(a[2]>0){a[2]--;ans++;}
27             if(a[0]>0 && a[1]>0){a[0]--,a[1]--;ans++;}
28             if(a[0]>0 && a[2]>0){a[0]--,a[2]--;ans++;}
29             if(a[2]>0 && a[1]>0){a[2]--,a[1]--;ans++;}
30             if(a[0]>0 && a[1]>0 && a[2]>0){a[0]--,a[1]--,a[2]--;ans++;}
31             printf("%d\n",ans);
32         }
33     }
34     return 0;
35 }

B:

题意:

一个人的在N个人,第一次排名是a,第二次排名是b,总排名分数是a+b,N个人从小到大排序,问他可能在N里面最小排多少名,最大排多少名

如果同分的话按照同分后面一名的名次-1来算

思路:

最大排名maxpos=min(x+y-1,N)

最小排名,就要比较中间值了,如果x+y<n+1,minpos=1,如果大于就是minpos=min(n,x+y-n+1);

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define inf 0x3f3f3f3f
 7 #define lowbit(x) (x)&(-x)
 8 #define mem(a,b) memset(a,b,sizeof(a))
 9 #define modd 998244353
10 const int maxn=1e5+10;
11 int n,m,t,x,y;
12 int main(){
13     scanf("%d",&t);
14     while(t--){
15         scanf("%d%d%d",&n,&x,&y);
16         int maxx=min(x+y-1,n),k=1,minn=1;
17         int zhong=n;
18         zhong++;
19         if(x+y<zhong){minn=1;}
20         else{
21             minn+=(x+y-n);
22         }
23         minn=min(minn,n);
24         printf("%d %d\n",minn,maxx);
25     }
26     return 0;
27 }

C1:

题意:

N长度为1000以内,一个数字两边的数字不能都比他高,最多高一边

求他最大sum。叙述有问题,直接看样例

3

10 6 8

因为6左右都比他高,选择10 6 6或者6 6  8,sum明显前者高

所以答案输出10 6 6

思路:

暴力

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 #define il inline
 5 #define it register int
 6 #define inf 0x3f3f3f3f
 7 #define lowbit(x) (x)&(-x)
 8 #define mem(a,b) memset(a,b,sizeof(a))
 9 #define modd 998244353
10 const int maxn=1e5+10;
11 int n,a[1100],b[1100];
12 int main(){
13     scanf("%d",&n);
14     int pos;
15     ll maxx=-1;
16     for(it i=1;i<=n;i++){
17         scanf("%d",&a[i]);
18     }
19     for(it i=1;i<=n;i++){
20        int zhi=a[i];ll sum=(ll)a[i];
21        for(it j=i+1;j<=n;j++){
22         if(a[j]<zhi){
23             zhi=a[j];
24         }
25         sum+=(ll)zhi;
26         }
27         zhi=a[i];
28         for(it j=i-1;j>0;j--){
29             if(a[j]<zhi){
30                 zhi=a[j];
31             }
32            sum+=(ll)zhi;
33         }
34         if(sum>maxx){
35             maxx=sum;pos=i;
36         }
37     }
38     int zhi=a[pos];b[pos]=a[pos];
39     for(it i=pos+1;i<=n;i++){
40         if(a[i]<zhi){
41             zhi=a[i];
42         }
43         b[i]=zhi;
44     }
45     zhi=a[pos];
46     for(it i=pos-1;i>0;i--){
47         if(a[i]<zhi){
48             zhi=a[i];
49         }
50         b[i]=zhi;
51     }
52     for(it i=1;i<=n;i++){
53         printf(i==n?"%d\n":"%d ",b[i]);
54     }
55     return 0;
56 }

待补C2DE

题外话:

因为这场B题费时太久,wa的太多,在看C2的时候,感觉是个dp,然后wa了两发,时间也来不及直接暴力去过C1了

D题感觉是个贪心

B题因为minn的x+y-n+1可能大于n这点,一直没考虑清楚,wa到自闭,幸好最后还是看到了

这场人也少,比的不好

原文地址:https://www.cnblogs.com/luoyugongxi/p/12354237.html

时间: 2024-07-30 14:03:07

Codeforces Round #622 (Div. 2)的相关文章

[Codeforces Round #622 (Div. 2)] - C2. Skyscrapers (hard version) (单调栈)

[Codeforces Round #622 (Div. 2)] - C2. Skyscrapers (hard version) (单调栈) C2. Skyscrapers (hard version) time limit per test 3 seconds memory limit per test 512 megabytes input standard input output standard output This is a harder version of the probl

Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version) 单调栈

Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version) 问题 传送门 我是参考了这篇题解传送门,然后按着思路做出了的(但大佬题解中的sumr[]数组操作我没看懂,然后自己改了改). 摘抄: 维护峰值最优 找左右边的第一个比自己小的元素,维护前缀和,找最大的峰值 l[i]:用单调栈维护左边第一个比它小的数 r[i]:用单调栈维护右边第一个比它小的数 suml[i]:左边的前缀和 sumr[i]:右边的前缀和 然后遍历一遍数组,找到

Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version)(单调栈,递推)

Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version) 题意: 你是一名建筑工程师,现给出 n 幢建筑的预计建设高度,你想建成峰状,如: 1 2 3 2 1 → 1 2 3 2 1 1 2 3 1 2 → 1 2 3 1 1 8 10 6 → 8 10 6 10 6 8 → 10 6 6 问所有建筑的高度和最大为多少. 思路: 单调递增栈栈顶存储以当前点为峰的单侧最低高度下标,另存储以每个点为峰的左右最大高度和. #includ

Codeforces Round #622 (Div. 2)C2 Skyscrapers最大&quot;尖&quot;性矩形,思维

题:https://codeforces.com/contest/1313/problem/C2 题意:给出n个数,分别代表第i个位置所能搭建的最大高度,问以哪一个位置的塔的高度为基准向左的每一个塔都小于等于临近右边的塔,向右每一个塔都大于等于临近的左边的塔所构建的高度之和是最大的,输出最大的高度之和: 分析:我们设一个fir[i]数组,表示当前 i 位置向左能构造的最大高度和(就想阶梯一样,i位置是阶梯的最高处),sec[i]则是向右的: 因为求出这俩个数组后,我们直接o(n)的访问fir[i

Codeforces Round #622 (Div. 2) C2. Skyscrapers (hard version)

题目链接:http://codeforces.com/contest/1313/problem/C2 题意:有n个房子,每个房子可以建的最高层数为a[i],但不可以出现相邻左右两边房子的层数都比中间高的情况,要求总共层数要尽可能的多,输出每个房子应该建几层. 思路:记录左边比自己小的第一个元素,同时可以求出当i为顶端是的前缀和.然后记录右边第一个比自己小的元素,同时可以求出当i为顶端是的后缀和.然后再遍历一篇,看谁为顶端时,总层数最多,最后再依次确定层数即可. #include<stdio.h>

Codeforces Round #622 (Div. 2)C2

题意 N长度为500000以内,一个数字两边的数字不能都比他高,最多高一边 求他最大sum.叙述有问题,直接看样例 3 10 6 8 因为6左右都比他高,选择10 6 6或者6 6  8,sum明显前者高 所以答案输出10 6 6 思路: 求出每个a[i]左边(minl[i])和右边(minl[i])最近的一个比他小的数,用前缀和(suml) 和 后缀和(sumr)求得当a[i]是顶点时候sum=suml+sumr-a[i]: 前缀和如果minl[i]==空集(0),那么suml[i]=i*a[

Codeforces Round #622 (Div. 2)C(单调栈,DP)

构造出的结果一定是一个单峰/\这种样子的 1 #define HAVE_STRUCT_TIMESPEC 2 #include<bits/stdc++.h> 3 using namespace std; 4 long long a[500007]; 5 pair<long long,long long>stk[500007]; 6 long long l[500007],r[500007];//记录左/右边最近的比当前小的位置 7 long long ans[500007]; 8 l

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿