可能是DFS写多了,看到这种题直接暴搜,结果T掉了7个点…
T7点代码:
#include <iostream>
#include <cstring>
using namespace std;
#define Max 1005
int t[Max];
bool flag[Max];
int res=0;
int n,num=0;
void dfs(int i,int t[]);
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t[i];
}
memset(flag, false, sizeof(flag));
dfs(1,t);
cout<<res<<endl;
}
void dfs(int i,int t[])
{
if(i==n+1) //如果选择了n个
{
res++;
res%=1000000007;
return ;
}
for(int j=1;j<=t[i];j++)
{
if(!flag[j]) {
flag[j] = true;
dfs(i+1,t);
flag[j]=false; //回溯
}
}
}
其实这道题是一道数学题:
思路:我们将输入的数字从小到大排序:比如我们依次输入 5 3 6
排序后就是 3 5 6
那么最后的结果就是 3*(5-1)*(6-2)=48
第一个选择以后,第二个不能重复选1 第二个选择以后第三个不能重复选1 2,所以要减去1
下面是ACcode:
#include <iostream>
#include <algorithm>
using namespace std;
#define Max 1005
typedef long long int ll;
int t[Max];
ll res=1;
int main()
{
int n;
cin>>n;
int c=0;
for(int i=1;i<=n;i++)
{
cin>>t[i];
}
sort(t+1,t+n+1);
for(int i=1;i<=n;i++)
{
res*=(t[i]-c);
c++;
res=res%1000000007;
}
cout<<res<<endl;
return 0;
}