这道题也是给了个ip 端口,以及密码让你连过去,连过去后返回的是个这个
先是200h的这个英文说明,很简单,后面会返回100000个uint16,然后用最少的交换,来完成这个,每次提交交换对如数例如123:9821,讲到交换最少,比较好想的是选择排序,就是排序起来慢些,不过应该挺好用的,因为每一位只需要一次交换,机子够好的话,网速也够好的话,o(n2)的速度完全可以接受,
我的py,因为这个题每5分钟只能测试一次,而且我的网速机子都太烂了(敢不敢实验室把机子配置更新下,网也烂啊),测试未果,放出来大家看看就好了。
#! /usr/bin/env python #coding=utf-8 import os, sys, struct, math, random, socket MX = 100000 T = 200514 times=0 def op(s): #print s global times times=times+1 if((times%10000)==100): print times sock.send(s + '\x0a') def swap(a,i,j): temp=a[i] a[i]=a[j] a[j]=temp def qsb(n,l,r): for i in xrange(r): lowindex=i for j in xrange(r,i,-1): if (n[j]<n[lowindex]): lowindex=j swap(n,i,j) op(str(i)+':'+str(j)) if __name__=='__main__': ary = [] sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect(('140.197.217.155', 5601)) s=sock.recv(100) print s sock.send('d0d2ac189db36e15\x0a') f = '' for i in xrange(10): d = sock.recv(50000) f=f+d f = f[512:200513] for i in range(MX): ui = f[i:i+2] uin = struct.unpack('<H', ui) ary.append(uin[0]) if len(ary) != MX: print 'error, len not 100000' sys.exit(1) qsb(ary, 0, MX-1) sock.send('\n') print 'send ok' w = open('back', 'w') while True: d = sock.recv(1024) if len(d) > 0: print d w.write(d) else: break print 'all done'
算法大致上没什么问题,可能细节有些问题吧,不过后来也没调了。。。。