落絮飞雁

顺流而下,把梦做完

HDOJ2107:Founding of HDU

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 6500 Accepted Submission(s): 4403
Problem Description
经过慎重的考虑,XHD,8600, LL,Linle以及RPG等ACM队员集体退役,甚至正在酝酿退学。
为什么?要考研?那也不用退学呀…
当然不是!真正的原因是他们想提前创业,想合伙成立一家公司,据说公司的名称都想好了,为了感谢多年的ACM集训队队长XHD,公司就叫海东集团(HaiDong Union),简称HDU.(对于这个公司名称,几个人私下里开玩笑说,外面的人看到HDU,可别以为是”胡捣集团”,呵呵)
公司成立了,谁来做老大呢?这对于合伙的公司可是一个难题。好在几位同学经过几年的ACM训练,思维非常活跃,马上想到推选AC战斗力最强的一位来做老总。
现在的问题就是,假设每人的AC战斗力是一个已知的整数,请编程输出最后选出的老总的AC战斗力。

Input
输入包含多组测试数据,每组数据占2行,首先一行是一个整数n(n<100),表示创立公司的人数,然后一行是n个32位整数,表示n个人的AC战斗力,n为0的时候结束输入。

Output
对于每个测试实例,请输出老总的AC战斗力,每个实例的输出占一行。

Sample Input
3
1 2 3
0

Sample Output
3

 

谁将是HDU的老总呢?
欲知后事如何,且听下回分解——

 

#include
int main()
{
	int n,ni,a[100],out;
	while(scanf("%d",&n)&&(n!=0))
	{
		for(ni=0;ni<n;ni++) 		{ 			scanf("%d",&a[ni]); 			if(ni==0) 			{ 				out=a[ni]; 			} 			if(a[ni]>out)
			{
				out=a[ni];
			}
		}
		printf("%dn",out);
	}
	return 0;
}

苍茫的水题,( ̄o ̄) . z Z

HDOJ1976:Software Version

Problem Description
相信大家一定有过在网上下载软件而碰到多个不同版本的情况。

一般来说,软件的版本号由三个部分组成,主版本号(Major Version Number),子版本号(Minor Version Number)和修订号(Revision_Number)。当软件进行了重大的修改时,主版本号加一;当软件在原有基础上增加部分功能时,主版本号不变,子版本号加一;当软件仅仅修正了部分bug时,主版本号和子版本号都不变,修正号加一。
在我们比较软件的两个版本的新旧时,都是先比较主版本号,当主版本号相同时再比较子版本号,前两者都相同的情况下再比较修正号。版本号越大的软件越新。

现在,Lele 在载软件的时候碰到了两个版本,请你告诉他哪个版本更新一些。

Input
输入的第一行有一个整数T,代表有T组测试。接下来有T组测试。
每组测试分两行,第一行有三个整数代表第一个软件版本的主版本号,子版本号和修订号。第二行也有三个整数代表第二个软件版本的主版本号,子版本号和修订号。

数据中出现的整数都在[0,1000]范围之内。

Output
对于每组测试,如果第一个软件的版本新点,请输出”First”,如果第二个软件的版本新点,请输出”Second”,否则输出”Same”。

Sample Input
3
1 1 0
1 1 1
1 1 1
1 1 0
1 1 1
1 1 1

Sample Output
Second
First
Same

 

#include
#include
int main()
{
	int n, ni, a[3], b[3];
	scanf("%d", &n);
	for (ni = 0; ni<n; ni++) 	{ 		memset(a, 0, sizeof(a)); 		memset(b, 0, sizeof(b)); 		scanf("%d%d%d", &a[0], &a[1], &a[2]); 		scanf("%d%d%d", &b[0], &b[1], &b[2]); 		if (a[0]>b[0]) printf("Firstn");
		else
		{
			if (a[0] < b[0]) printf("Secondn"); 			else 			{ 				if (a[1]>b[1]) printf("Firstn");
				else
				{
					if (a[1] < b[1]) printf("Secondn"); 					else 					{ 						if (a[2]>b[2]) printf("Firstn");
						else
						{
							if (a[2] < b[2]) printf("Secondn");
							else printf("Samen");
						}
					}
				}
			}
		}
	}
	return 0;
}

水题一次过,没什么好说的……

HDOJ2089:不要62

Problem Description
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。

Input
输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。

Output
对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。

Sample Input
1 100
0 0

Sample Output
80

先放上AC代码:

#include
#include
int i[1000000]; //大数组开在外面
int main()
{
	int t, flag,sum,a,n,m,j;
	memset(i, 0, sizeof(i));
	for (a = 0; a < 1000000; a++)
	{
		t = a; flag = 0;
		while (t)
		{
		if (t % 10 == 4 || t % 100 == 62)
		{
			flag = 1; break;
		}
		else
		{
			t = t / 10;
		}
		}
		if (flag == 1)i[a] = 1;
	}
	while (scanf("%d%d", &n, &m) && (n != 0 || m != 0))
	{
		sum = 0;
		for (j = n; j <= m; j++)
		{
			if (i[j] == 0)sum++;
		}
		printf("%dn", sum);
	}
	return 0;
}

看到题目就直接开做了,觉得这题目也没什么难度。做好之后本机编译通过,递交OJ——TLE!

放上TLE代码吧:

#include<stdio.h>
int main()
{
	int n,m,i[10],j,ji,flag,sum,k,num;
	while(scanf("%d%d",&n,&m)&&(n!=0||m!=0))
	{

		sum=0;
		for (num = n; num <= m; num++)
		{
			ji = 0;
			j = num;
			while (j != 0)
			{
				i[ji] = j % 10;
				j = j / 10;
				ji++;
			}
			flag = 1;
			for (k = 0; k < ji; k++)
			{
				if (i[k] == 2)
				{
					if (i[k + 1] == 6)
					{
						flag = 0;
					}
				}
				if (i[k] == 4)
				{
					flag = 0;
				}
			}
			if (flag == 1)
			{
				sum++;
			}
		}
		printf("%dn",sum);
		}
		return 0;
	}

 

题目要求的时间比较短,百度了一下,“打表法”可以解决。类似于先将有穷的解运算出来并放到一张表(数组)中。然后根据输入在表中查询,输出结果。

注意大数组要开在main()函数之外。


这题一共贡献了两次TLE,两次WA……说好的一次过呢……

 

电脑使用i-Hangzhou免费热点的方法

本文旨在讨论i-Hangzhou热点的访问原理,不赞成访客利用此方法访问网络。任何问题由访客承担。转载本文请注明出处和链接。

【原理】看不下去的可以直接拉到下面看方(Feng)法(Jing)


 

 

这两天有点略无聊。之前拿来玩的Openwrt和NAS都被我打包在大学寝室了。手头没有能折腾的东西。突然想起之前在萧图看到自习室有i-Hangzhou的免费wifi,只是不能用电脑连接(提示:抱歉,本服务只能在移动设备使用。)。当时用了几个手机浏览器模拟了一下也是不行。依稀觉得很蹊跷也没有再管。现在刚好闲的无聊,公司这边也能勉强搜到这个热点。折腾一下,顺便学学HTTP报文。


 

通过大量的抓包后发现,对于设备的判断是在服务器端进行的。如图,本地验证成功或绕过后仍然无法连接。

但服务器端究竟是怎么验证的我也布吉岛(-__-)b。我用Wireshark依次抓取了电脑与手机的包,依照手机端的包数据将电脑包逐一修改后发送。还是不行……郁闷死。又因为TCP的特殊性,不能重发数据包。彻底无语。

无奈,只能架服务器搞转发了。这下总算成功了。(●ˇ∀ˇ●)

扫面了一下内网,发现i-hangzhou是由一个架在外网的Discuz服务器(用于发部消息与新闻)和一个内网的服务器(用于登陆验证)组成。把那个内网的服务器看了一下,发现验证是在cgi-bin上完成的,哭死了……返回类似于

rad_user_infoac_id=7&auth_mode=1&nas_init_port=1&action=juniper_mac_auth&&city_name=hangzhou&url=&nas_ip=30.254.XXX.X&vlan_id=XXXX&user_group_id=11&zone_group_id=4&ssid=0&mac=XXXX.XXXX.XXXX&username=你的手机号&phone=同上,还是你注册时候的手机号

这样的代码串,继续研究就无力了。总之,电脑访问i-Hangzhou热点的目的已经达到~撒花~

*★,°*:.☆( ̄▽ ̄)/$:*.°★*


 

说下方法。

普通青年方法:

  1. 连入i-Hangzhou热点。
  2. 在地址栏输入这个链接:http://172.168.1.10/hangzhou/mobile/phone/pda_login_bak.html

【推荐】文艺青年方法:

  1. 高冷的连接到i-Hangzhou热点。
  2. 优雅的打开手机wifi类软件:魔方Wifi助手(测试通过)、猎豹免费Wifi、APwifi等。注意上网方式。(话说文青不是用OS X么)
  3. 手机验证一下就OK了~

死宅方法:

中间人


真相时间:

最后知道真相的我眼泪流下来

 

还有就是,这个热点对访问人数是有限制的(详见代码页)。

呵呵……

 

HDOJ题目分类

状态压缩dp:

1074,4272,2167,1565,1438,4281,3502

树形dp:

4008,1561,1520,4340,4267,2196,2412,1011,1054

图论:

最短路

2544,2066,2112,1874,1142,1385,1548,1217,2680,2923,2962,2722,1690,1482,1596,1598
2377,2363,2433,2722,1690,2482

生成树

3371,4081,1879,1102,1864,1233,4126,3311,2489,4408,1875,1171

网络流:

1733,4309,4292,2686,4289,1532,3657,3338,4280

KMP:

1686,1711,3613,1358,4300,2595,1358,3336,3746,3763,2594,2203,4333

AC自动机:

2222,2896,2243,2296,3691,3065,3247

字典树:

1247,1800,1075,1251,2846,2846,1671,4287,1671,3724,1298

后缀数组:

3518,4436,3518,4080,3518,4209

伸展树:

3487,1890,3487,3436

线段树:

1166,1754,4027,4302,1542,4031,4288,4417

树状数组:

4358,3874,1892,3743,1541,2492,3584

HDOJ2304:Electrical Outlets

Problem Description
Roy has just moved into a new apartment. Well, actually the apartment itself is not very new, even dating back to the days before people had electricity in their houses. Because of this, Roy’s apartment has only one single wall outlet, so Roy can only power one of his electrical appliances at a time.
Roy likes to watch TV as he works on his computer, and to listen to his HiFi system (on high volume) while he vacuums, so using just the single outlet is not an option. Actually, he wants to have all his appliances connected to a powered outlet, all the time. The answer, of course, is power strips, and Roy has some old ones that he used in his old apartment. However, that apartment had many more wall outlets, so he is not sure whether his power strips will provide him with enough outlets now.
Your task is to help Roy compute how many appliances he can provide with electricity, given a set of power strips. Note that without any power strips, Roy can power one single appliance through the wall outlet. Also, remember that a power strip has to be powered itself to be of any use.

Input
Input will start with a single integer 1 <= N <= 20, indicating the number of test cases to follow. Then follow N lines, each describing a test case. Each test case starts with an integer 1 <= K <= 10, indicating the number of power strips in the test case. Then follow, on the same line, K integers separated by single spaces, O1 O2 . . . OK, where 2 <= Oi <= 10, indicating the number of outlets in each power strip.

Output
Output one line per test case, with the maximum number of appliances that can be powered.

Sample Input
3
3 2 3 4
10 4 4 4 4 4 4 4 4 4 4
4 10 10 10 10

Sample Output
7
31
37

欢乐地一次过,60AC达成~(貌似有点晚),,ԾㅂԾ,,

#include
int main()
{
	int n,ni,j,ji,a[20],sum;
	scanf("%d",&n);
	while(n--)
	{
		scanf("%d",&j);
		sum=0;
			for(ji=0;ji

 

HDOJ2051:Bitset

Problem Description
Give you a number on base ten,you should output it on base two.(0 < n < 1000)

Input
For each case there is a postive number n on base ten, end of file.

Output
For each case output a number on base two.

Sample Input
1
2
3

Sample Output
1
10
11

一道看起来高端的水题。AC代码:

#include
#include
int main()
{
    int two[1000], cache, len, i;
    while (~scanf("%d", &cache))
    {
        memset(two, 0, sizeof(two));
        i = 0;
        while (cache !=0)
        {
            two[i] = cache % 2;
            cache = cache / 2;
            i++;
        }
        len = i;
        for (i = (len-1); i >= 0; i--)
        {
            printf("%d", two[i]);
        }
        printf("n");
    }
    return 0;
}

一开始是直接用的strlen()函数,一直报错,郁闷……犯这种低级错误。( ̄﹏ ̄;)

最后也算欢乐的一次过了吧。(-。-;)

Emeditor半透明插件——Transparent プラグイン

今天看一只程序媛打代码,她用的文本编辑器是半透明的。可以一边看文档一边敲代码。感觉这样会很舒服,结果查了一下那个软件只有OS X版本…………

于是乎就想实现窗口半透明,找了几个软件,都不好用。突然想起之前我曾经写过几个VB的小程序,可以随便调透明度,大小,结束窗口会话什么的。说不定改一下就能用了。于是乎兴高采烈的打开VS,结果提示我工程文件太久,无法升级。找文档,微软蜀黍是这样讲的:如何:升级 Visual Basic 6.0 项目-MSDN 。逼着我下载一个VS2005?!

感觉好麻烦,求助于编辑器插件。找了好久,找到这个:


正文:

Transparent プラグイン

为Emeditor实现半透明效果

官网提供了32位64位的插件下载地址。可以我的Emeditor只能用32位的……不知道为什么。

插件虽然是日语的,但是选项里只有一个滚动条供你拖。( •̀ ω •́ )y肯定是调透明度的嘛……


好高兴啊,又可以快乐的打(Tou)码(Lan)了

 

 

HDOJ2028:Lowest Common Multiple Plus

Problem Description
求n个数的最小公倍数。

 

Input
输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。

 

Output
为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。

 

Sample Input
2 4 6
3 2 5 7

 

Sample Output
12
70
辗转相除法解决,放上AC代码;
#include
int fun(int m, int n)
{
	int i;
	if (m
	

Excel中批量添加多张工作表并重命名

今天的任务还是做表归类。需要在一个Excel文件中建立26张工作ibao,并以a~z进行重命名。方便对厂家进行归类。这种工作还是交给VBA好了……

  1. 新建一个Excel文件,打开。
  2. Alt+F11,召唤神龙!
  3. 复制下面的代码

 

Sub 批量加表()
Dim i&, userinto
i = 0
userinto = 26
If IsNumeric(userinto) = True Then
Do Until i = userinto
Worksheets.Add
i = i + 1
Loop
End If
For i = 1 To Sheets.Count
Sheets(i).Name = i + 100
Next i
For i = 0 To Sheets.Count - 1
Sheets(i + 1).Name = Chr(97 + i)
Next i
End Sub

第四行中的26可以改成想要添加表格的数量。如果只需要批量添加表格而不重命名的话可以用这个

Sub 批量加表()
Dim i&, userinto
i = 0
userinto = 26
If IsNumeric(userinto) = True Then
Do Until i = userinto
Worksheets.Add
i = i + 1
Loop
End If
End Sub

就是这样~