Codeforces 665D Simple Subset [简单数学]
题意:
给你n个数,让你从中选一个子集要求子集中的任何两个数相加都是质数。
思路:
一开始把自己坑了,各种想,后来发现一个简单的性质,那就是两个数相加的必要条件是这两个数之中必定一个奇数一个偶数,(除了含有1 集合以外,1+1等于2也是质数)。
考虑两种情况,有1存在和1不存在这两种。
很显然1存在的情况下,所有的1都可以同时在集合中出现,要想集合最大不能加奇数,只能加偶数,那么我们看原始集合中是否有偶数加一是素数。
不考虑1的情况下,这样的子集最大是2,只有存在一个奇数一个偶数相加是质数的情况下才存在个数是2的子集。
比较下输出答案就好了==
#include<bits/stdc++.h>
using namespace std;
int prime[];
int tmp[];
int ji[],ou[];
int num[];
bool can[][],goon[];
void fprime()
{
int atmp=,i,j;
for(i=;i<;i++)
{
if(!prime[i])
{
tmp[atmp++]=i;
}
for(j=;j<atmp;j++)
{
if(i*tmp[j]>)
break;
prime[i*tmp[j]]=;
if(i%tmp[j]==)
break;
}
}
}
int main()
{
fprime();
int n,tmp,num_one=,num_ji=,num_ou=;
scanf("%d",&n);
for(int i=;i<n;i++){
scanf("%d",&tmp);
if(tmp==)num_one++;
else if(tmp&)ji[num_ji++]=tmp;
else ou[num_ou++]=tmp;
}
bool have_jiou=;
int ans_ji,ans_ou;
for(int i=;i<num_ji;i++){
for(int j=;j<num_ou;j++){
if(prime[ji[i]+ou[j]]==){
have_jiou=;
ans_ji=ji[i];ans_ou=ou[j];
break;
}
}
}
bool have_oneou=;
int ans_oneou;
for(int i=;i<num_ou;i++){
if(prime[ou[i]+]==){
have_oneou=;
ans_oneou=ou[i];
break;
}
}
num_one+=have_oneou;
if(num_one>=){
printf("%d\n",num_one);
if(have_oneou)printf("%d ",ans_oneou);
for(int i=;i<num_one-have_oneou;i++)printf("1 ");
}
else if(have_jiou){
printf("2\n%d %d",ans_ou,ans_ji);
}
else{
printf("1\n");
if(num_ou)printf("%d\n",ou[]);
else if(num_ji)printf("%d\n",ji[]);
else printf("1\n");
}
}
Codeforces 665D Simple Subset [简单数学]的更多相关文章
- Codeforces 665D Simple Subset【构造】
题目链接: http://codeforces.com/problemset/problem/665/D 题意: 给定序列,从中找出最大的子集,使得子集中的数两两相加均为质数. 分析: 貌似有用最大团 ...
- codeforces 665D Simple Subset
题目链接 给一个数列, 让你选出其中的m个数, 使得选出的数中任意两个数之和都为质数, m尽可能的大. 首先, 除了1以外的任意两个相同的数相加结果都不是质数. 然后, 不考虑1的话, 选出的数的个数 ...
- CodeForces - 665D Simple Subset 想法题
//题意:给你n个数(可能有重复),问你最多可以取出多少个数使得任意两个数之和为质数.//题解:以为是个C(2,n)复杂度,结果手摸几组,发现从奇偶性考虑,只有两种情况:有1,可以取出所有的1,并可以 ...
- CodeFores 665D Simple Subset(贪心)
D. Simple Subset time limit per test 1 second memory limit per test 256 megabytes input standard inp ...
- Codeforces 626E Simple Skewness 「数学」「二分」
题意: 给你一堆无序数,寻找它的一个子堆,使得子堆的平均数减中位数最大. 数字的个数n<=2e5 0<=xi<=1e6. 思路: 首先可以证明这堆数一定是奇数个,证明方法是尝试在奇数 ...
- Educational Codeforces Round 12 D. Simple Subset 最大团
D. Simple Subset 题目连接: http://www.codeforces.com/contest/665/problem/D Description A tuple of positi ...
- coeforces 665D D. Simple Subset(最大团orsb题)
题目链接: D. Simple Subset time limit per test 1 second memory limit per test 256 megabytes input standa ...
- HDU 5073 Galaxy (2014 Anshan D简单数学)
HDU 5073 Galaxy (2014 Anshan D简单数学) 题目链接http://acm.hdu.edu.cn/showproblem.php?pid=5073 Description G ...
- 洛谷试炼场-简单数学问题-P1403 [AHOI2005]-因数
洛谷试炼场-简单数学问题 P1403 [AHOI2005]约数研究 Description 科学家们在Samuel星球上的探险得到了丰富的能源储备,这使得空间站中大型计算机"Samuel I ...
随机推荐
- 【转】C# Winform打包部署时添加注册表信息实现开机启动
使用VS自带的打包模块可以很方便的对项目进行打包部署,同时我们也可以在安装部署时操作注册表实现开机启动软件.具体实现如下: 1.添加安装部署项目后,鼠标右键安装项目->视图->注册表,HK ...
- html颜色字体字符代码
HTML字体代码表 宋体 SimSun 宋体:SimSuncss中中文字体(font-family)的英文名称 黑体 SimHei Mac OS的一些: 微软雅黑 Microsoft YaHe ...
- AMD规范:define和require的区别
define和require在依赖处理和回调执行上都是一样的,不一样的地方是define的回调函数需要有return语句返回模块对象(注意是对象),这样define定义的模块才能被其他模块引用:req ...
- web压力测试 - http_load
http_load是基于linux平台的一个性能测工具 非常小巧易用,可以用并行方式运行,来测试web服务器的性能 测试方式 (1)准备测试url vim url.txt 填写要测试的url,可以写多 ...
- Saiku操作界面的简化
在安装完毕Saiku后,由于是社区版本,所以界面上存在很多升级为商业版的文字.为了使得系统不那么碍眼,可通过如下方式更改来去除相应的内容: 1.去除查询页面的升级为商业版的提示 You are usi ...
- C语言中的数组和指针以及字符串
数组名同时也是该数组首元素的地址,而指针提供了一种用来使用地址的符号方法,因此指针能够很有效地处理数组. 将一个整数加给指针,这个整数会和指针所指类型的字节数相乘,然后所得的结果会加到初始地址上 da ...
- tomcat内存修改 解决内存溢出异常
有时候tomcat刚解压完,部署项目后运行会报内存溢出的错误. 原因:项目过大,tomcat内存小. 解决:找到[tomcat]/bin/catlina.bat文件,打开: 在@echo off上面( ...
- 开始学习IOS
最好的学习方式就是动手. 对于有编程经验的程序员来说,学习另外一门技术最好的方式就是coding,虽然基础知识和IDE都不熟悉,但是在写代码的过程中,不断的解决问题,不断查找资料,不断感悟代码,一切都 ...
- 怎么优化JAVA程序的执行效率和性能?
现在java程序已经够快的了,不过有时写出了的程序效率就不怎么样,很多细节值得我们注意,比如使用StringBuffer或者StringBuilder来拼接或者操作字符串就比直接使用String效率高 ...
- fiddler Android下https抓包全攻略
fiddler Android下https抓包全攻略 fiddler的http.https的抓包功能非常强大,可非常便捷得对包进行断点跟踪和回放,但是普通的配置对于像招商银行.支付宝.陌陌这样的APP ...