CodeForces 550B
2015-07-17 16:45
246 查看
题意:有n个问题,从中至少选出两个问题,其难度总和不小于l,不大于r,且最大难度与最小难度之差要大于x。
参考了大神的代码,才写出来。
思路:状态压缩,枚举
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int n,l,r,x,c[20],maxx,minn,s,ans,cnt;
long long sum;
while(scanf("%d%d%d%d",&n,&l,&r,&x)!=EOF)
{
ans = 0;
for(int i = 0;i < n;i ++)
scanf("%d",&c[i]);
s = (1 << n) - 1;
for(int i = 1;i <= s;i ++)
{
cnt = 0; maxx = 0; minn = 99999999; sum=0;
for(int j = 0;j < n;j ++)
{
if((1 << j)&i)
{
cnt ++;
sum += c[j];
maxx = max(maxx,c[j]);
minn = min(minn,c[j]);
}
}
if(cnt >= 2&&maxx-minn >= x&&sum >= l&&sum <= r)
ans ++;
}
printf("%d\n",ans);
}
return 0;
}
参考了大神的代码,才写出来。
思路:状态压缩,枚举
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int main()
{
int n,l,r,x,c[20],maxx,minn,s,ans,cnt;
long long sum;
while(scanf("%d%d%d%d",&n,&l,&r,&x)!=EOF)
{
ans = 0;
for(int i = 0;i < n;i ++)
scanf("%d",&c[i]);
s = (1 << n) - 1;
for(int i = 1;i <= s;i ++)
{
cnt = 0; maxx = 0; minn = 99999999; sum=0;
for(int j = 0;j < n;j ++)
{
if((1 << j)&i)
{
cnt ++;
sum += c[j];
maxx = max(maxx,c[j]);
minn = min(minn,c[j]);
}
}
if(cnt >= 2&&maxx-minn >= x&&sum >= l&&sum <= r)
ans ++;
}
printf("%d\n",ans);
}
return 0;
}
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- C#使用DeflateStream解压缩数据文件的方法
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C++联合体转换成C#结构的实现方法
- C#实现的算24点游戏算法实例分析
- C#调用WinRar执行rar、zip压缩的方法
- C++编写简单的打靶游戏