Codeforces Round #622 (Div. 2)
A:
题意:
有ABC的三种菜,现在有a个A,b个B,c个C,问能组成多少种不同菜单
思路:
abc都大于等于4,肯定是7种,给abc排个序,从大到小举例删减
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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);
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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
思路:
暴力
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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到自闭,幸好最后还是看到了
这场人也少,比的不好
upd:
已补题:C2