版权声明:转载的时候记着点个赞再评论一下! https://blog.csdn.net/LOOKQAQ/article/details/82215666
时间限制1 Second 内存限制 512 Mb
题目描述
你有n个问题,你已经估计了第i个问题的难度为Ci,现在你想使用这些问题去构造一个问题集。比赛的问题集必须包含至少两个问题,而且比赛的总难度必须至少为l至多为r,此外最简单的问题和最难的问题之间的差异至少为x请您找出能够选择的问题集的数量。
输入
第一行有T组输入(1 ≤ T ≤ 10接下来一行输入n, l, r, x (1 ≤ n ≤ 10, 1 ≤ l ≤ r ≤ 1e9, 1 ≤ x ≤ 1e6)然后输入n个正整数 c1, c2, c3....cn (1 ≤ ci ≤ 1e6)
输出
每组输出单独占一行,一个正整数表示答案
输入样例
2
3 5 6 1
1 2 3
4 40 50 10
10 20 30 25
输出样例
2
2
思路1):二进制枚举就好了,不用整花里胡哨的!
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define MaxN 0x3f3f3f3f
#define MinN 0xc0c0c0c0
int a[11];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,l,r,x,ans=0; //ans记录答案
scanf("%d %d %d %d",&n,&l,&r,&x);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<(1<<n);i++)
{
int di_easy = MaxN; //用于记录最简单的问题难度
int di_diff = MinN; //用于记录最难的问题难度
int sum=0; //记录比赛的总难度
for(int j=0;j<n;j++)
{
if(i&(1<<j)) //枚举每一种状态
{
di_easy = min(a[j],di_easy);
di_diff = max(a[j],di_diff);
sum+=a[j];
}
}
if(sum>=l && sum<=r && di_diff - di_easy>=x) //判断是否符合条件
ans++;
}
printf("%d\n",ans);
}
return 0;
}
思路:2)dfs,简单粗暴。标程如下:
#include <bits/stdc++.h>
using namespace std;
const int MAXN=20;
int a[MAXN];
int n,l,r,x;
int ans=0;
void dfs(int sum,int s,int p,int cnt)
{
if(cnt>=2&&sum>=l&&sum<=r&&a[s]-a[p]>=x)
{
ans++;
}
for (int i = s+1; i <n ; ++i) {
if(sum+a[i]<=r)
dfs(sum+a[i],i,p,cnt+1);
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
ans=0;
scanf("%d%d%d%d",&n,&l,&r,&x);
for (int i = 0; i <n ; ++i) {
scanf("%d",&a[i]);
}
sort(a,a+n);
for (int i = 0; i <n ; ++i) {
dfs(a[i],i,i,1);
}
printf("%d\n",ans);
}
return 0;
}