HDU6188 duizi and shunzi

Nike likes playing cards and makes a problem of it. 

Now give you n integers,  ai(1in)ai(1≤i≤n) 

We define two identical numbers (eg:  2,22,2) a Duizi, 
and three consecutive positive integers (eg:  2,3,42,3,4) a Shunzi. 

Now you want to use these integers to form Shunzi and Duizi as many as possible. 

Let s be the total number of the Shunzi and the Duizi you formed. 

Try to calculate  max(s)max(s)

Each number can be used only once. 
InputThe input contains several test cases. 

For each test case, the first line contains one integer n( 1n1061≤n≤106). 
Then the next line contains n space-separated integers  aiai ( 1ain1≤ai≤n
OutputFor each test case, output the answer in a line. 
Sample Input
7
1 2 3 4 5 6 7
9
1 1 1 2 2 2 3 3 3
6
2 2 3 3 3 3 
6
1 2 3 3 4 5
Sample Output
2
4
3
2


        
  
Hint
Case 1(1,2,3)(4,5,6)

Case 2(1,2,3)(1,1)(2,2)(3,3)

Case 3(2,2)(3,3)(3,3)

Case 4(1,2,3)(3,4,5)



        
 

其实就是个贪心,在可组成顺子的牌数少于两张的时候优先打对子,但是如果顺子的牌的数量超过两张,那么第三张无论如何都要组成顺子。

错了三次,一次没有清数组,一次忘记第一张牌就可以打对子的情况,最后一次是当打出顺子的时候没有对记录数组减一。

#include<iostream>
#include<algorithm>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstdio>
#include<cstring>

using namespace std;

int p[1000005];
int t[1000005];

int main()
{
	int n;
	while (~scanf("%d",&n))
	{
		memset(t, 0, sizeof(t));
		for (int i = 0; i < n; i++)
		{
			scanf("%d", &p[i]);
			t[p[i]]++;
		}

		sort(p, p + n);

		int last = 0;
		int temp = 0;
		int ans = 0;

		for (int i = 0; i < n; i++)
		{
			if (temp == 0)
			{
				last = p[i];
				temp++;
				if (t[p[i]]>=2)
				{
					ans++;
					t[p[i]] -= 2;
					temp = 0;
					i++;
				}
			}
			else
			{
				if (temp == 2 && last == p[i] - 1)
				{
					ans++;
					temp = 0;
					t[p[i]]--;
					
				}
				else if (t[p[i]] >= 2)
				{
					t[p[i]] -= 2;
					ans++;
					i++;
				}
				else if(last != p[i] - 1)
				{
					temp = 0;
					last = p[i];
					temp++;

				}
				else if (last == p[i] - 1)
				{
					temp++;
					last = p[i];
					t[p[i]]--;

				}
			
			}
				
		}
		cout << ans << endl;
	}
	return 0;
}


全部评论

相关推荐

03-15 00:45
已编辑
中国科学院大学 Java
问的很简单都秒了,但是面试官没开摄像头,疑似kpi,无后续。--------------------3/14更新,3/12通知给了口头offer,3/13发了意向书,已拒。一面(35min)(25/3/6)(无后续)&nbsp;&nbsp;&nbsp;&nbsp;1、自我介绍&nbsp;&nbsp;&nbsp;&nbsp;2、介绍一下你的那个Python相关项目(本科毕设,web系统+算法模型提供部分接口)&nbsp;&nbsp;&nbsp;&nbsp;3、Java面向对象有哪些特点呢?详细说一下。&nbsp;&nbsp;&nbsp;&nbsp;4、介绍一下hashmap;为什么要把链表转换为红黑树呢?红黑树查找的时间复杂度?1.7和1.8的区别。&nbsp;&nbsp;&nbsp;&nbsp;5、介绍一下concurrentHashmap。&nbsp;&nbsp;&nbsp;&nbsp;6、synchronized锁和Lock锁有什么区别?&nbsp;&nbsp;&nbsp;&nbsp;7、公平锁的一个底层是怎么实现的呢?&nbsp;&nbsp;&nbsp;&nbsp;8、线程池的核心参数、拒绝策略、提交一个任务执行流程?&nbsp;&nbsp;&nbsp;&nbsp;9、spring有哪些特点?(ioc/aop)&nbsp;&nbsp;&nbsp;&nbsp;10、spring中对于循环依赖是怎么解决的?&nbsp;&nbsp;&nbsp;&nbsp;11、MySQL和redis的区别?&nbsp;&nbsp;&nbsp;&nbsp;12、MySQL的索引结构是什么?&nbsp;&nbsp;&nbsp;&nbsp;13、MySQL的事务有哪些特性?怎么保证?&nbsp;&nbsp;&nbsp;&nbsp;14、MySQL的默认隔离级别?可重复读是怎么做到的呢?&nbsp;&nbsp;&nbsp;&nbsp;15、介绍一下MVCC和快照读readview。&nbsp;&nbsp;&nbsp;&nbsp;16、一般在什么场景下会使用redis?&nbsp;&nbsp;&nbsp;&nbsp;17、对于大量的请求,如果此时缓存中还没有写入数据怎么办?&nbsp;&nbsp;&nbsp;&nbsp;18、介绍一下redis实现的分布式锁。&nbsp;&nbsp;&nbsp;&nbsp;19、有用过es和mongo&nbsp;DB吗?(知道,没用过)&nbsp;&nbsp;&nbsp;&nbsp;20、消息中间件用过吗?说一下你的使用场景?&nbsp;&nbsp;&nbsp;&nbsp;21、一个场景,如果说有一个接口响应的比较慢,如果说让你排查,你会怎么去排查?(上下游接口、大key问题,只答了两,后面试官补充)&nbsp;&nbsp;&nbsp;&nbsp;无手撕,反问业务。
胖墩墩的查理在学c语言:哥们我是五号面的 流程差不多
查看21道真题和解析
点赞 评论 收藏
分享
可以不说话:笔试a了3道半,今天说是挂了😭😭
投递汇丰科技等公司8个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务