第一题题目没看懂
团的蛋糕铺长期霸占着美团APP中“蛋糕奶茶”栏目的首位,因此总会吸引各路食客前来探店。
小团一天最多可以烤n个蛋糕,每个蛋糕有一个正整数的重量。
早上,糕点铺已经做好了m个蛋糕。
现在,有一个顾客要来买两个蛋糕,他希望买这一天糕点铺烤好的最重的和最轻的蛋糕,并且希望这两个蛋糕的重量恰好为a和b。剩余的n-m个蛋糕可以现烤,请问小团能否满足他的要求
按答案意思是顾客的要求是已经烤好的m个蛋糕的重量应该介于a\b之间。
关键理解n是什么作用,n-m是现烤的,现烤的是完全可以满足要求的,如果烤好的已经超过了的话,就得返回false了。
抄了份题解
/*
20:46
总共n个,已有m个,a最重b最轻
已有的蛋糕数量已知
首先,要买最重和最轻。如果a,b在已有蛋糕重量中不是最重和最轻,则无法满足
设还可以烤k个蛋糕,k=n-m.
如果n < 2,pass,no
如果n >= 2:
m == 0, 则k = 2,yes
m == 1:
如果这个蛋糕=a或=b, k >= 1,yes
如果这个蛋糕b<蛋糕<a,我们需要自己做a,b,此时如果k>=2,yes
m >= 2:
如果所有蛋糕都在[b,a],且有a也有b,yes
如果所有蛋糕都在(b,a),我们要自己做a,b. 若k>=2,yes
以上,把n和m所有可能的情况都考虑到了,再加上a和b比较大小这种坑b条件
*/
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, m, a, b;
while(~scanf("%d%d%d%d",&n,&m,&a,&b))
{
bool f = 0;
int k = n-m;
if(a < b) swap(a,b); //**条件
if(n >= 2)
{
if(m == 0) f = 1;
else if(m == 1)
{
int x;
scanf("%d",&x);
if((x == a || x == b) && k >= 1) f = 1;
if(x > b && x < a && k >= 2) f = 1;
}
else
{
int Max, Min;
for(int i = 0;i < m;i++)
{
int x;
scanf("%d",&x);
if(i == 0) Min = x, Max = x;
Min = min(Min,x);
Max = max(Max,x);
}
if(Min == b && Max == a) f = 1;
if(Min >= b && Max <= a && k >= 2) f = 1;
}
}
if(f) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
第二题感觉能做出来,没集中精力,
小团是某综艺节目的策划,他为某个游戏环节设计了一种晋级规则,已知在这个游戏环节中每个人最后都会得到一个分数score_i,显而易见的是,游戏很有可能出现同分的情况,小团计划该环节晋级人数为x人,则将所有人的分数从高到低排序,所有分数大于等于第x个人的分数且得分不为0的人都可以晋级。
请你求出本环节的实际晋级人数。显然这个数字可能是0,如果所有人的得分都是0,则没有人满足晋级条件。
错误代码:没有考虑第x个人分数重复会有多个,所以是可能大于x的
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n,x;
cin >> n >> x;
vector <int> scores(n);
for(int i = 0;i < n;i++)
{
int score;
cin >> score;
scores[i] = score;
}
sort(scores.begin(),scores.end(),greater<int>());
int res = 0;
while(res < x)
{
//cout << scores[res] <<endl;
if(scores[res] == 0)
{
break;
}
res++;
}
cout << res << endl;
return 0;
}
正确代码:做了简单的修改,
if(res >= x && scores[res] != scores[x-1])
{
break;
}
把等于的那种情况排除出去
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main()
{
int n,x;
cin >> n >> x;
vector <int> scores(n);
for(int i = 0;i < n;i++)
{
int score;
cin >> score;
scores[i] = score;
}
sort(scores.begin(),scores.end(),greater<int>());
int res = 0;
while(res < n)
{
if(res >= x && scores[res] != scores[x-1])
{
break;
}
//cout << scores[res] <<endl;
if(scores[res] == 0 )
{
break;
}
res++;
}
cout << res << endl;
return 0;
}
小美请小团吃回转寿司。转盘上有N盘寿司围成一圈,第1盘与第2盘相邻,第2盘与第3盘相邻,…,第N-1盘与第N盘相邻,第N盘与第1盘相邻。小团认为第i盘寿司的美味值为A[i](可能是负值,如果小团讨厌这盘寿司)。现在,小团要在转盘上选出连续的若干盘寿司,使得这些寿司的美味值之和最大(允许不选任何寿司,此时美味值总和为0)。
输入描述:
第一行输入一个整数T(1<=T<=10),表示数据组数。
每组数据占两行,第一行输入一个整数N(1<=N<=10^5);
第二行输入N个由空格隔开的整数,表示A[1]到A[N](-104<=A[i]<=104)。
输出描述:
每组数据输出占一行,输出一个整数,表示连续若干盘寿司的美味值之和的最大值。
输入例子1:
1
4
3 -2 4 -1
输出例子1:
6
#include <bits/stdc++.h>
using namespace std;
int main(){
int T,N;
cin>>T;
for(int i=0;i<T;i++){
cin>>N;
int Max=INT_MIN,Min=INT_MAX,res;
vector<int> arr(N);
for(int i=0;i<N;i++){
cin>>arr[i];
}
int total=0;
vector<int>dpMax(N);
vector<int>dpMin(N);
dpMax[0]=dpMin[0]=arr[0];
total+=arr[0];
//分析,最大值为单个序列最大或是首尾相连(总和减去最小值),取两者最大
for(int i=1;i<N;i++){
total+=arr[i];
dpMax[i]=max(dpMax[i-1]+arr[i],arr[i]);
dpMin[i]=min(dpMin[i-1]+arr[i],arr[i]);
if(Max<dpMax[i]) Max=dpMax[i];
if(Min>dpMin[i]) Min=dpMin[i];
}
res = max(Max,total-Min);
cout<<res<<endl;
}
return 0;
}