牛牛的最大兴趣数组
题面
链接:https://ac.nowcoder.com/acm/contest/7604/C
牛牛的班级中有n个人,他们的性格各不相同。
牛牛现在想要从这n个人中选出一些人组成一个兴趣小组,但是他想让参加这个兴趣小组的人数尽可能的多。但是他有不想让其中有任何一对人之间由于性格问题产生矛盾。
具体来说,如果这个兴趣小组中出现两个人性格值的乘积开三次方根是一个正整数,就认为他们两个性格不合。
比如一个性格值为2的同学和一个性格值为4的同学就是性格不合的,因为2*4=8,而一个性格值为2的同学和一个性格值为8的同学性格相合,可以出现在同一个兴趣小组中,因为2*8=16,16开三次方根不是一个正整数。
请你告诉牛牛,他们班的同学组成的最大兴趣小组的人数是多少。
解法
贪心。
可以想到,对于后续操作来说,2和16是没有区别的,因为只要和2性格不合的数,一定和16性格不合。推而广之,如果a和b性格不合,那么如果\(c=\dfrac{a}{t^3},t\in N^+\),那么c一定和b性格不合。
所以可以先把每个元素里的立方数先剔除,然后再进行后续处理。
可以想到,分解之后的数a一定满足:
\(a=\prod{p_i^{c_i}},c_i\in\{1,2\}\),其中p为质数。
为什么指数一定是1或2呢?因为凡是大于3的都被剔除了。然后就可以想到如果b和a是性格不合的,那么b剔除立方数之后(假设为d)一定满足:
\(d=\prod{p_i^{3-c_i}}\),因为只有这样才能满足a和d相乘之后每个质因数的次数都是三的倍数。
很明显,对于任何一个a,有且仅有一个d与之对应。也就是说,a和d只能选一个,而且这个选择和其它任何选择没有关系。那肯定选多的(比如有3个a,2个d,那肯定选a,并把答案加上3)。
用map记录即可。
#include<cstdio>
#include<map>
#define int long long
//#define zczc
using namespace std;
const int N=100010;
inline void read(int &wh){
wh=0;int f=1;char w=getchar();
while(w<'0'||w>'9'){if(w=='-')f=-1;w=getchar();}
while(w<='9'&&w>='0'){wh=wh*10+w-'0';w=getchar(); }
wh*=f;return;
}
inline int max(int s1,int s2){
return s1<s2?s2:s1;
}
int m,a[N],b[N];
map<int,int>sum;
map<int,bool>vis;
inline void get(int wh,int data){
for(int i=2;;i++){
int nl=i*i*i;
if(nl>data)break;
while(data%nl==0)data/=nl;
}
a[wh]=data;
sum[data]++;
int now=1;
for(int i=2;i*i<=data;i++){
int nsum=0;
while(data%i==0)data/=i,nsum++;
if(nsum==1)now*=i*i;
if(nsum==2)now*=i;
}
if(data>1)now*=data*data;
b[wh]=now;
return;
}
signed main(){
#ifdef zczc
freopen("in.txt","r",stdin);
#endif
read(m);
int ans=0,in;
for(int i=1;i<=m;i++){
read(in);get(i,in);
}
for(int i=1;i<=m;i++){
if(vis[a[i]])continue;
if(a[i]==1)ans++;
else ans+=max(sum[b[i]],sum[a[i]]);
vis[a[i]]=vis[b[i]]=true;
}
printf("%lld\n",ans);
return 0;
}
原文地址:https://www.cnblogs.com/dai-se-can-tian/p/15196484.html
- Spring Cloud中的API网关服务Zuul
- MYSQL | 企业整合解决方案之mysql集群搭建-主从配置
- Spring Cloud中Feign配置详解
- Spring Cloud中Feign的继承特性
- JavaScript 常用方法总结
- Spring Cloud中声明式服务调用Feign
- Spring Cloud中Hystrix仪表盘与Turbine集群监控
- 轻量级压力测试工具 - AB
- Spring Cloud中Hystrix的请求合并
- Spring Cloud中Hystrix的请求缓存
- mysql主从复制配置
- Spring Cloud系列勘误
- Spring Cloud Stream使用细节
- Redis3 对集群进行重新分片
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- winform总结6=>线程和委托的关系
- winform总结3> 有趣的bat/winform程序完成自己的任务,然后把自己删除
- winform总结2> Action<> ,Action,func<>,委托相关的理解
- winform开发 总结1>winform程序使用线程的必要性,以及正确的使用方式
- Winform 后台将指定的控件集合添加到制定容器中
- C#微信公众平台接入示例代码
- FreeRTOS三种数据结构区别(StreamBuffer,MessageBuffer,Queue)
- Keras & Tensorflow 笔记
- Netty之HTTP协议应用开发
- 超全Python IDE武器库大总结,优缺点一目了然!
- Set源码解析(红黑树)
- RouteOnAttribute
- PutHiveStreaming
- 【LINUX】开发环境搭建
- C 库函数 - strcat()