这道题,emmm感觉出题人有点误人子弟了,一堆歧义的语句,刚开始我以为是能分的组的最小值,但是仔细想象,小绿应该没这么简单,果不其然只拿了60
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
typedef long long int ll;
using namespace std;
int main()
{
ll n;
cin>>n;
ll a[n+1];
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1); //从小到大排序
ll dp[n+1];
for(int i=1;i<=n;i++)
{
dp[i]=1;
}
vector<int > t;
for(int i=2;i<=n;i++)
{
if(a[i]==a[i-1]+1)
{
dp[i]=dp[i-1]+1;
if(i==n) //如果是最后一个,必须手动添加了
{
t.push_back(dp[i]);
}
}
else
{
t.push_back(dp[i-1]);
if(i==n)
{
t.push_back(dp[i]);
}
}
}
if(t.empty())
{
cout<<n;
}
else{
cout<<*min_element(t.begin(),t.end());
}
return 0;
}
后来要我朋友分析了一波,题目的意思是,分组尽量平均分,分完后找出最少的那个组,譬如 2233,分完就是 23 23 并不是2 23 3这三个组(其实我喜欢2233姐哈哈哈哈),大佬貌似都是用二分来做二的,我就用栈来做吧下面是AC代码:
#include <iostream>
#include <stack>
#include <vector>
#include <algorithm>
#include <cstring>
typedef long long int ll;
using namespace std;
int main()
{
ll n;
cin>>n;
ll a[n+1];
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
sort(a+1,a+n+1); //从小到大排序
vector<stack<int> > t;
for(int i=1;i<=n;i++)
{
ll Max=10<<12;
int rem;
bool flag=false;
int num=t.size(); //不能直接j<=t.size() 可能是编译器的原因
for(int j=0;j<=num-1;j++) //n---t.size()表示组份分
{
if(a[i]==t[j].top()+1&&t[j].size()<Max)
{
Max=t[j].size();
rem=j;
flag=true;
}
}
if(flag)
{
t[rem].push(a[i]);
}
else
{
stack<int > temp;
temp.push(a[i]);
t.push_back(temp);
}
}
ll Min=10<<12;
for(vector<stack<int> >::iterator it=t.begin();it!=t.end();it++)
{
if((*it).size()<Min)
{
Min=(*it).size();
}
}
cout<<Min<<endl;
return 0;
}