也不算题解吧,反正应该也没人会看到.
主要是纪念一下这个事情.
最大的排列是一个dfs,我的搜索好菜,写的很丑,效率也很低.
刚好坐满的公交车,其实这题很容易,但是可怕就可怕在题目里告诉要取模,但是我想着的枚举,怎么可能要取模呢,然后就没继续想了.
/* xzppp */
#include <bits/stdc++.h>
using namespace std;
#define FFF freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#define lson MAXN,m,rt<<1
#define rson m+1,r,rt<<1|1
#define MP make_pair
#define PB push_back
typedef long long LL;
typedef unsigned long long ULL;
const int MAXN = 5000;
const int INF = 0x7fffffff;
const int MOD = 1e9+7;
bool can = false,drop = false;
int a[MAXN],n;
void dfs(int x,vector<int > have,vector<int> ans )
{
if(can) return;
int use = -1;
for (int i = have.size()-1; i > -1&&!can; --i)
{
if(drop&&have[i]!=-1)
{
use = have[i];
ans.PB(have[i]);
have[i] = -1;
if(x==n-1)
{
for(int i=0;i<ans.size();++i)
printf("%d ",ans[i]);
can = true;
}
else
{
dfs(x+1, have,ans);
have[i] = use;
ans.pop_back();
}
}
if(have[i]!=-1&&have[i]<=a[x]&&!can&&!drop)
{
use = have[i];
ans.PB(have[i]);
have[i] = -1;
if(x==n-1)
{
for(int i=0;i<ans.size();++i)
printf("%d ",ans[i]);
can = true;
}
else
{
if(use<a[x]) drop = true;
dfs(x+1, have,ans);
have[i] = use;
ans.pop_back();
}
}
}
}
int main()
{
//FFF
cin>>n;
for (int i = 0; i <n; ++i)
scanf("%d",a+i);
vector<int > have,ans;
for (int i = 0; i < n; ++i)
{
have.PB(i);
}
dfs(0, have,ans);
if(!can)
printf("-1\n");
return 0;
}
/* xzppp */
#include <bits/stdc++.h>
using namespace std;
#define FFF freopen("in.txt","r",stdin);freopen("out.txt","w",stdout);
#define lson MAXN,m,rt<<1
#define rson m+1,r,rt<<1|1
#define MP make_pair
#define PB push_back
typedef long long LL;
typedef unsigned long long ULL;
const int MAXN = 500000+17;
const int INF = 0x7fffffff;
const int MOD = 1e9+7;
LL a[MAXN],sum[MAXN];
int main()
{
//FFF
int n;
cin>>n;
for (int i = 0; i < n; ++i)
{
scanf("%d",a+i);
sum[i] =(i==0?0:sum[i-1])+a[i];
}
LL temp = 0,ans = 0;
for (int i = 0; i < n; ++i)
{
temp += a[i];
if(sum[n-1]%temp==0)
{
int need = sum[n-1]/temp,p=2;
for (int j = i+1; j < n; ++j)
if(p*temp == sum[j])
p++;
if(need == p-1)
ans++;
}
}
cout<<ans<<endl;
return 0;
}