小蓝有 k 种卡片, 一个班有 n 位同学, 小蓝给每位同学发了两张卡片, 一 位同学的两张卡片可能是同一种, 也可能是不同种, 两张卡片没有顺序。没有 两位同学的卡片都是一样的。
给定 n, 请问小蓝的卡片至少有多少种?
输入一行包含一个正整数表示 n 。
输出一行包含一个整数, 表示答案。
6
3
小朋友们手中的卡片可能是: (1,1),(1,2),(1,3),(2,2),(2,3),(3,3) 。
对于 50% 的评测用例, 1≤n≤10^4 。
对于所有评测用例, 1≤n≤10^9 。
一开始没注意n的规模,直接暴力模拟,key和value。
模拟的思路是,当value=1的时候,只能组合成1-1,那么value就提升到2,然后就可以组合成1-1,1-2,2-1,2-2,当value提升到3,key重置为1,继续模拟:1-1,1-2,1-3,2-1,2-2,2-3,3-3,直接使用set去重即可。
结果啪的一下,很快啊,只过了50%,其余部分超时了。
超时代码:
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
//至少有多少种,所以求出n位同学可能拿到的卡片数量的组合,从1-1,开始,判断长度是否满足,不满足就变成1-2,2-2,1-3,2-3,3-3
int key = 1;
int value = 1;
Set<String> set = new HashSet<>();
while(set.size()<n){
set.add(key+","+value);
if(key<value){
key++;
}else{
key = 1;
value++;
}
}
//取出set,判断一共有多少个数字
Set<Integer> nums = new HashSet<>();
for(String str : set){
//切割一下
String[] strs = str.split(",");
nums.add( Integer.parseInt( strs[0] ) );
nums.add( Integer.parseInt( strs[1] ) );
}
System.out.println( nums.size() );
scan.close();
}
}
然后看n的范围,10^9次方,如果要模拟所有子串,会到O(n^2),绝对超时,所以暴力模拟行不通。
然后换一种思路,可不可以找一下规律呢?即当n=1的时候,k=1,n=2的时候,k=2。
所以直接复制了上面的代码,写了个for,判断n从1-100之间的结果,看看有没有规律。
public static void main(String[] args) {
for(int n = 1;n<100;n++){
//至少有多少种,所以求出n位同学可能拿到的卡片数量的组合,从1-1,开始,判断长度是否满足,不满足就变成1-2,2-2,1-3,2-3,3-3
int key = 1;
int value = 1;
Set<String> set = new HashSet<>();
while(set.size()<n){
set.add(key+","+value);
if(key<value){
key++;
}else{
key = 1;
value++;
}
}
//取出set,判断一共有多少个数字
Set<Integer> nums = new HashSet<>();
for(String str : set){
//切割一下
String[] strs = str.split(",");
nums.add( Integer.parseInt( strs[0] ) );
nums.add( Integer.parseInt( strs[1] ) );
}
System.out.println( "n:"+n+",size:"+nums.size() );
}
}
跑一下程序,出结果一看,果然是可以找规律的。
n:1,size:1
n:2,size:2
n:3,size:2
n:4,size:3
n:5,size:3
n:6,size:3
n:7,size:4
n:8,size:4
n:9,size:4
n:10,size:4
n:11,size:5
n:12,size:5
n:13,size:5
n:14,size:5
n:15,size:5
n:16,size:6
n:17,size:6
n:18,size:6
n:19,size:6
n:20,size:6
n:21,size:6
n:22,size:7
n:23,size:7
n:24,size:7
n:25,size:7
n:26,size:7
n:27,size:7
n:28,size:7
n:29,size:8
n:30,size:8
n:31,size:8
n:32,size:8
n:33,size:8
n:34,size:8
n:35,size:8
n:36,size:8
n:37,size:9
n:38,size:9
n:39,size:9
n:40,size:9
n:41,size:9
n:42,size:9
n:43,size:9
n:44,size:9
n:45,size:9
n:46,size:10
n:47,size:10
n:48,size:10
n:49,size:10
n:50,size:10
n:51,size:10
n:52,size:10
n:53,size:10
n:54,size:10
n:55,size:10
用n和k来替代,我们不难看出,k的出现规律是和自身数字有关的。
也就是说,我们可以直接拿到n,然后进行判断,如果k=1的时候,我们就让n-1,k=2的时候,我们就让n-2,k=3的时候,我们就让n-3..……。这样,当n<=0的时候,我们的k就得到了。
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
int k = 0;
//穷举之后发现了规律
while(n>0) {
k++;
n -= k;
}
//循环出来的k就是结果
System.out.println(k);
scan.close();
}
}
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我完全不是程序员,正在学习使用Ruby和Rails框架进行编程。我目前正在使用Ruby1.8.7和Rails3.0.3,但我想知道我是否应该升级到Ruby1.9,因为我真的没有任何升级的“遗留”成本。缺点是什么?我是否会遇到与普通gem的兼容性问题,或者甚至其他我不太了解甚至无法预料的问题? 最佳答案 你应该升级。不要坚持从1.8.7开始。如果您发现不支持1.9.2的gem,请避免使用它们(因为它们很可能不被维护)。如果您对gem是否兼容1.9.2有任何疑问,您可以在以下位置查看:http://www.railsplugins.or
我创建了一个由于“在运行时执行的单例元类定义”而无法编码的对象(这段代码的描述是否正确?)。这是通过以下代码执行的:#defineclassXthatmyusesingletonclassmetaprogrammingfeatures#throughcallofmethod:break_marshalling!classXdefbreak_marshalling!meta_class=class我该怎么做才能使对象编码正确?是否可以从对象instance_of_x的classX中“移除”单例组件?我真的需要一个建议,因为我们的一些对象需要通过Marshal.dump序列化机制进行缓存。
我正在查看Ruby日志记录库Logging.logger方法并从sourceatgithub提出问题与这段代码有关:logger=::Logging::Logger.new(name)logger.add_appendersappenderlogger.additive=falseclass我知道类 最佳答案 这实际上删除了方法(当它实际被执行时)。这是确保close不会被调用两次的保障措施。看起来好像有嵌套的“class 关于Ruby元编程问题,我们在StackOverflow上找到一
使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案
我正在开发一个xcode自动构建系统。在执行一些预构建验证时,我想检查指定的证书文件是否已被撤销。我了解securityverify-cert验证其他证书属性但不验证吊销。我如何检查撤销?我正在用Ruby编写构建系统,但我对任何语言的想法都持开放态度。我阅读了这个答案(Openssl-Howtocheckifacertificateisrevokedornot),但指向底部的链接(DoesOpenSSLautomaticallyhandleCRLs(CertificateRevocationLists)now?)进入的Material对我的目的来说有点过于复杂(用户上传已撤销的证书是一
关闭。这个问题是off-topic.它目前不接受答案。想改进这个问题吗?Updatethequestion所以它是on-topic用于堆栈溢出。关闭11年前。Improvethisquestion我不经常使用ruby-通常它加起来相当于每两个月或更长时间编写一次脚本。我的大部分编程都是使用C++进行的,这与ruby有很大不同。由于我与ruby之间的差距如此之大,我总是忘记语言的基本方面(比如解析文本文件和其他简单的东西)。我想每天练习一些基本的东西,我想知道是否有一些我可以订阅的网站,并且会向我发送当天的Ruby问题或类似的东西。有人知道这样的站点/Internet服务吗?
我一直在寻找一种以编程方式或通过命令行将mp3转换为aac的方法,但没有成功。理想情况下,我有一段代码可以从我的Rails应用程序中调用,将mp3转换为aac。我安装了ffmpeg和libfaac,并能够使用以下命令创建aac文件:ffmpeg-itest.mp3-acodeclibfaac-ab163840dest.aac当我将输出文件的名称更改为dest.m4a时,它无法在iTunes中播放。谢谢! 最佳答案 FFmpeg提供AAC编码功能(如果您已编译它们)。如果您使用的是Windows,则可以从here获取完整的二进制文件。
我想输入一个字符串并返回一个可用于描述字符串结构的正则表达式。正则表达式将用于查找更多与第一个结构相同的字符串。这是故意模棱两可的,因为我肯定会漏掉SO社区中的某个人会发现的情况。请发布任何和所有可能的方法来做到这一点。 最佳答案 简单的答案(可能不是您想要的)是:返回输入字符串(正则表达式特殊字符转义)。这始终是与字符串匹配的正则表达式。如果您希望识别某些结构,则必须提供有关您希望识别的结构类型的更多信息。如果没有这些信息,问题就会以模棱两可的方式陈述,并且有许多可能的解决方案。例如,输入字符串'aba'可以描述为'阿巴''阿巴*