第三题:
有n个人参加编程比赛,比赛结束后每个人都得到一个分数,现在所有人排成一圈(第一个和第n个相邻)领取奖品,要求:
1.现在某个人的分数比左右的人告,那么奖品数量也比左右的人多;
2.每个人至少得到一个奖品
问最少应该准备多少个奖品?
测试用例:
N组数据
每组数组输入n个人,n个人的分数
输入:
2
2
1 2
4
1 2 3 3
输出
3
8
leetcode相似题:candy
思路:先从左至右遍历,如果i+1的元素比i要大,那个i+1的奖品数就等于i的奖品数+1,否则就保持为1.然后再从右向左遍历,如果当前i的分数比i+1的分数要大,那么当前分数就等于max(当前的分数, i+1的分数+1)。
代码:
int main()
{
int N;
cin>>N;
while(N--)
{
int n;
int *rates=new int[n];
cin>>n;
for(int i=0;i<n;i++)
cin>>rates[i];
vector<int> num(n, 1); //初始化为1
for(int i=1;i<n;i++)
{
if(rates[i]>rates[i-1])
num[i]=num[i-1]+1;
}
for(int i=n-1; i>=0; i--)
{
if(rates[i]>rates[(i+1)%n])
num[i]=max(num[i], num[(i+1)%n]+1);
}
int sum=0;
for(int i=0;i<n; i++)
sum+=num[i];
cout<<sum<<endl;
}
return 0;
}
第四题:
有N根绳子,第i根绳子长度为Li,现在需要M根等长的绳子,你可以对n根绳子进行任意剪裁(不能拼接),请你帮忙设计出这m根绳子最长的长度是多少?
输入描述:
输入N,M
N个Li
输入:
3 4
3 5 4
输出:
2.50
二分(注意精度,以及保留两位小数)
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <vector>
#include <string.h>
#include <algorithm>
using namespace std;
vector<double> L;
int n,m;
bool check(double k)
{
int count=0;
for(int i=0; i<n; i++)
{
count+=L[i]/k;
}
return count>=m;
}
double slove(vector<double>& L)
{
double l=0.f, r=L[n-1]+1.f;
while(l<r)
{
double k=(l+r)/2.0;
if(check(k))
{
l=k;
}
else
{
r=k-0.001;
}
}
return l;
}
int main()
{
cin>>n>>m;
double x;
for(int i=0; i<n; i++)
{
cin>>x;
L.push_back(x);
}
sort(L.begin(), L.end());
double result;
result=slove(L);
printf("%.2f", result);
return 0;
}
第二题:
修正拼写错误:
- 3个相同的字母连在一起,去掉一个:helllo–>hello
- 两对一样的字母(AABB型)连在一起,一定是拼写错误,去掉第二对的一个字母就好了,比如:helloo–>hello
- 上面的规则优先“从左到右”匹配,即AABBCC,优先考虑修复AABB,结果为AABCC
思路:新建一个新的字符串,在新的字符串上进行判断,如果没有错误就将字符添加到newstring中,否则继续根据newstring之前的字符串进行判断。
输入:
2
helloo
wooooooow
输出:
hello
woow
代码:
#include <iostream>
#include <cstdlib>
#include <vector>
#include <string.h>
using namespace std;
int main()
{
int N;
cin>>N;
while(N--)
{
string s;
cin>>s;
if(s.size()<2)
{
cout<<s<<endl;
return 0;
}
string newstring=s.substr(0,2);
int i=2,j=2;
while(i<s.size())
{
if(newstring[j-2]==newstring[j-1] && newstring[j-1]==s[i])
{
i++;
}
else if(j>2 &&newstring[j-3]==newstring[j-2] && newstring[j-1]==s[i])
{
i++;
}
else
{
newstring+=s[i];
j++;
i++;
}
}
cout<<newstring<<endl;
}
return 0;
}