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
");}
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
",ans);
32         }
33     }
34     return 0;
35 }
View Code

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
",minn,maxx);
25     }
26     return 0;
27 }
View Code

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
":"%d ",b[i]);
54     }
55     return 0;
56 }
View Code

待补C2DE

题外话:

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

D题感觉是个贪心

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

这场人也少,比的不好

upd:

已补题:C2

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