TopCoder练习:OptimalQueue (SRM 297 Div1 Easy)
问题:某银行设置tellCount台ATM机器,每次机器服务一位客户需要serviceTime分钟。在ATM开始服务以前,就有客户等待。如果有一个n位客户,他们分别在ATM开始服务之前的等待时间可以表示成一个序列{ t1, t2, t3, …, tn }。ATM开始服务之后需要尽快处理客户请求,求这种情况下需要最短多少时间可以处理完所有客户请求。
等级:简单
解答:ATM机器可以同时服务tellCount位客户。从排队等待时间最长的客户开始服务,可以保证在最短时间内处理完所有客户请求。所以,对等待时间序列排序,每次取出tellCount个元素中的最大值并且加上serviceTime就是本轮客户一共花费的时间,依次计算处理每一轮客户请求所花费的时间。返回这些结果中的最大值。
import java.util.Arrays;
public class OptimalQueue {
public int minWaitingTime(int[] clientArrivals,
int tellerCount,
int serviceTime) {
int[] shadow = Arrays.copyOf(clientArrivals, clientArrivals.length);
for (int i = 0; i < shadow.length; i++) shadow[i] *= -1;
Arrays.sort(shadow);
for (int i = 0; i < shadow.length; i++) shadow[i] *= -1;
for (int i = 0; i < shadow.length; i++)
ret = Math.max(ret, shadow[i] + (i / tellerCount + 1) * serviceTime);
return ret;
}
}
以Funtoo为基础的Linux桌面系统(6)
配置Openbox。
“less is more.”
Openbox有一个非常易用而且简洁的配置界面——文本文档。为了保证openbox按照用户的意愿正常工作,至少需要以下三个文件。
所有这些文件都必须放在~/.config/openbox目录中。以上链接都是经过实验之后的最终配置。其中一些与声音相关的配置我会在后面的文章中细说。还有一些工具比如剪贴板和输入法也会单独给出配置的例子。这里我觉得需要解释一下的是启动文件。
这个autostart.sh文件仅仅是一个shell script。openbox启动时会执行这个文件并启动其中的程序。但是这并不是X系统中自动启动应用程序的唯一方法。Freedesktop.org的标准中xdg是其他桌面系统通用的自动启动方法。因为xdg可能会与autostart.sh冲突。用户必须选择其中一个方式来启动桌面系统程序。而我通常会选择将所有的自启动程序都用autostart.sh脚本来管理。因为这种方式更简洁。
问题是,禁用xdg中的程序需要一点小窍门:需要把全局配置文件拷贝到本地再修改。比如,禁止xdg启动pulse-audio就需要下面这几步。
$ cp /etc/xdg/autostart/pulseaudio.desktop ~/.config/autostart/ $ $ sed -i '$ a Hidden=true' ~/.config/autostart/pulseaudio.desktop
此外,两个重要的桌面部件也需要它们自己的配置文件。
这两个文件需要放在不同的位置,下载上面链接中的文件后,可以使用下面这个命令搞定。
$ cp ~/Downloads/tint2rc ~/.config/tint2/tint2rc $ cp ~/Downloads/conkyrc ~/.conkyrc
此外,这里需要一个脚本辅助前文中提到的Compositor正常工作。
下载脚本,将它拷贝到/usr/local/bin里面去。
$ cp xcompmgr-crunchbang /usr/local/bin/xcompmgr-crunchbang
用startx命令启动桌面,测试一下现有配置。
上面提到的脚本中包含一些尚未来得及叙述的工具和服务,比如音频服务器,网络配置工具和快速运行工具等等。这些都会在以后的文章中详细描述。现在我们来谈谈如何把Openbox打扮起来。漂亮脸蛋是好软件的一个重要特性。因为funtoo.org最初的目标是建立一个可靠的面向服务器的操作系统。所以,对于界面的设计和美观考虑较少。所以,这里介绍打大多数软件包都是我从Crunchbang和Ubuntu借来重新打包而成。如果要使用这些软件,必须先在emerge中添加私用的overlay。步骤如下:
$ sudo mkdir -p /usr/local/portage/overlay
$ sudo chown $(whoami):portage /usr/local/portage/overlay
$ sudo chmod g+s /usr/local/portage/overlay ## setgid
$ git clone git://github.com/jcadam/picky-overlay.git overlay
$ cd ${HOME}
$ su -c 'echo "PORTDIR_OVERLAY=/usr/local/portage/overlay/" >> /etc/make.conf'
$ sudo emerge --sync
$ sudo emerge --update --newuse --deep world
安装gtk主题。
$ emerge -av x11-themes/crunchbang-artwork
这个包是我从Crunchbang的早期版本中移植过来并且经过长期测试的一个比价优秀的gtk+-2.0主题。主色调是灰色,与任何桌面系统搭配都不会特别突兀。当然,用户也可以根据个人喜好选择其他的gtk+主题。启用这个主题的方法非常简单。在Openbox桌面上点击右键(Preference)->(User Interface Settings)在Widget标签中选择Crunchbang,即可。
安装和配置鼠标指针。
$ emerge -av vanilla-dmz-xcursors ## WHITE, for black version vanilla-dmz-aa-xcursors
安装字体和字体配置。
$ emerge -Nav =media-fonts/anonymous-pro-1.002 \ =media-fonts/arphicfonts-0.2.20080216.1 \ =media-fonts/baekmuk-fonts-2.2-r2 \ =media-fonts/bitstream-cyberbit-2.0 \ =media-fonts/cardo-1.04 \ =media-fonts/corefonts-1-r6 \ =media-fonts/croscorefonts-1.21.0 \ =media-fonts/dejavu-2.33 \ =media-fonts/dina-2.89 \ =media-fonts/droid-113-r2 \ =media-fonts/encodings-1.0.4 \ =media-fonts/font-adobe-100dpi-1.0.3 \ =media-fonts/font-adobe-75dpi-1.0.3 \ =media-fonts/font-adobe-utopia-100dpi-1.0.4 \ =media-fonts/font-adobe-utopia-75dpi-1.0.4 \ =media-fonts/font-adobe-utopia-type1-1.0.4 \ =media-fonts/font-alias-1.0.3 \ =media-fonts/font-arabic-misc-1.0.3 \ =media-fonts/font-bh-100dpi-1.0.3 \ =media-fonts/font-bh-75dpi-1.0.3 \ =media-fonts/font-bh-lucidatypewriter-100dpi-1.0.3 \ =media-fonts/font-bh-lucidatypewriter-75dpi-1.0.3 \ =media-fonts/font-bh-ttf-1.0.3 \ =media-fonts/font-bh-type1-1.0.3 \ =media-fonts/font-bitstream-100dpi-1.0.3 \ =media-fonts/font-bitstream-75dpi-1.0.3 \ =media-fonts/font-bitstream-speedo-1.0.2 \ =media-fonts/font-bitstream-type1-1.0.3 \ =media-fonts/font-cronyx-cyrillic-1.0.3 \ =media-fonts/font-cursor-misc-1.0.3 \ =media-fonts/font-daewoo-misc-1.0.3 \ =media-fonts/font-dec-misc-1.0.3 \ =media-fonts/font-ibm-type1-1.0.3 \ =media-fonts/font-isas-misc-1.0.3 \ =media-fonts/font-jis-misc-1.0.3 \ =media-fonts/font-micro-misc-1.0.3 \ =media-fonts/font-misc-cyrillic-1.0.3 \ =media-fonts/font-misc-ethiopic-1.0.3 \ =media-fonts/font-misc-meltho-1.0.3 \ =media-fonts/font-misc-misc-1.1.2 \ =media-fonts/font-mutt-misc-1.0.3 \ =media-fonts/font-schumacher-misc-1.1.2 \ =media-fonts/font-screen-cyrillic-1.0.4 \ =media-fonts/font-sony-misc-1.0.3 \ =media-fonts/font-sun-misc-1.0.3 \ =media-fonts/font-util-1.3.0 \ =media-fonts/font-winitzki-cyrillic-1.0.3 \ =media-fonts/font-xfree86-type1-1.0.4 \ =media-fonts/freefonts-0.10-r3 \ =media-fonts/inconsolata-20090222 \ =media-fonts/intlfonts-1.2.1 \ =media-fonts/ipamonafont-1.0.8 \ =media-fonts/ja-ipafonts-003.03 \ =media-fonts/jisx0213-fonts-20040425-r2 \ =media-fonts/kacst-fonts-2.0 \ =media-fonts/kanjistrokeorders-2.016 \ =media-fonts/kochi-substitute-20030809-r3 \ =media-fonts/konfont-0.1 \ =media-fonts/liberation-fonts-2.00.0-r1 \ =media-fonts/libertine-ttf-5.1.3.20110615 \ =media-fonts/lohit-fonts-2.4.2 \ =media-fonts/mix-mplus-ipa-20120411_p2 \ =media-fonts/monafont-2.90-r2 \ =media-fonts/montecarlo-0 \ =media-fonts/mplus-fonts-2.2.4 \ =media-fonts/mplus-outline-fonts-0_pre052 \ =media-fonts/profont-x11-2 \ =media-fonts/sazanami-20040629 \ =media-fonts/shinonome-0.9.11 \ =media-fonts/takao-fonts-003.02.01 \ =media-fonts/terminus-font-4.38 \ =media-fonts/thaifonts-scalable-0.4.17 \ =media-fonts/tibetan-machine-font-1.901 \ =media-fonts/ttf-bitstream-vera-1.10-r3 \ =media-fonts/ubuntu-font-family-0.80 \ =media-fonts/urw-fonts-2.4.9 \ =media-fonts/wqy-bitmapfont-0.9.9_p0 \ =media-fonts/wqy-microhei-0.2.0_beta \ =media-fonts/wqy-unibit-1.1.0_p1 \ =media-fonts/wqy-zenhei-0.9.45
不要对这个长长的列列表感到惊讶,因为后面有更长的列表!其实,因为兼容性和历史遗留问题字体支持在Linux系统中很久以来都并不是很完美。而上面这个列表是经过测试能够满足中文和日语用户日常需求的一个组合。仅仅安装这些字体还不过,这里还需要对各个字体进行配置之后才能正常使用。
$ emerge -av ubuntu-language-selector $ eselect fontconfig enable 30-cjk-aliases.conf $ eselect fontconfig enable 69-language-selector-zh-cn.conf
仅仅将上面两个配置文件设为有效并不能得到最好的字体显示效果。经过多次调试,一下这个列表是我认为比较设和中文用户的配置列表。列表中带星号的条目都应该被设置为有效。
Available fontconfig .conf files (* is enabled): [1] 10-autohint.conf * [2] 10-no-sub-pixel.conf [3] 10-sub-pixel-bgr.conf [4] 10-sub-pixel-rgb.conf * [5] 10-sub-pixel-vbgr.conf [6] 10-sub-pixel-vrgb.conf [7] 10-unhinted.conf [8] 11-lcdfilter-default.conf [9] 11-lcdfilter-legacy.conf [10] 11-lcdfilter-light.conf [11] 20-fix-globaladvance.conf * [12] 20-unhint-small-dejavu-sans-mono.conf [13] 20-unhint-small-dejavu-sans.conf [14] 20-unhint-small-dejavu-serif.conf [15] 20-unhint-small-vera.conf * [16] 25-ttf-arphic-ukai-render.conf [17] 25-ttf-arphic-uming-bitmaps.conf [18] 25-ttf-arphic-uming-render.conf [19] 25-unhint-nonlatin.conf [20] 30-cjk-aliases.conf * [21] 30-metric-aliases.conf * [22] 30-urw-aliases.conf * [23] 35-ttf-arphic-ukai-aliases.conf * [24] 35-ttf-arphic-uming-aliases.conf [25] 40-nonlatin.conf * [26] 41-ttf-arphic-ukai.conf * [27] 41-ttf-arphic-uming.conf [28] 42-luxi-mono.conf * [29] 43-wqy-zenhei-sharp.conf [30] 44-wqy-zenhei.conf * [31] 45-latin.conf * [32] 49-sansserif.conf * [33] 50-user.conf * [34] 51-local.conf * [35] 57-dejavu-sans-mono.conf [36] 57-dejavu-sans.conf * [37] 57-dejavu-serif.conf * [38] 59-google-droid-sans-mono.conf * [39] 59-google-droid-sans.conf [40] 59-google-droid-serif.conf [41] 60-latin.conf * [42] 60-liberation.conf * [43] 62-croscore-arimo.conf [44] 62-croscore-cousine.conf [45] 62-croscore-symbolneu.conf [46] 62-croscore-tinos.conf [47] 64-ttf-arphic-uming.conf [48] 64-ttf-thai-tlwg.conf [49] 65-fonts-persian.conf * [50] 65-khmer.conf * [51] 65-nonlatin.conf * [52] 66-ja-ipafonts.conf * [53] 66-lohit-assamese.conf * [54] 66-lohit-bengali.conf [55] 66-lohit-gujarati.conf [56] 66-lohit-hindi.conf [57] 66-lohit-kannada.conf [58] 66-lohit-kashmiri@devanagari.conf [59] 66-lohit-konkani.conf [60] 66-lohit-maithili.conf [61] 66-lohit-marathi.conf [62] 66-lohit-oriya.conf [63] 66-lohit-punjabi.conf [64] 66-lohit-sindhi@devanagari.conf [65] 66-lohit-tamil.conf [66] 66-lohit-telugu.conf [67] 66-takao-fonts.conf [68] 67-lohit-malayalam.conf * [69] 67-lohit-nepali.conf [70] 69-language-selector-ja-jp.conf * [71] 69-language-selector-ka-ge.conf [72] 69-language-selector-ko-kr.conf [73] 69-language-selector-zh-cn.conf * [74] 69-language-selector-zh-hk.conf [75] 69-language-selector-zh-mo.conf [76] 69-language-selector-zh-sg.conf [77] 69-language-selector-zh-tw.conf [78] 69-unifont.conf * [79] 70-no-bitmaps.conf [80] 70-yes-bitmaps.conf [81] 75-ttf-arphic-ukai-select.conf [82] 80-delicious.conf * [83] 85-wqy-bitmapsong.conf [84] 89-ttf-thai-tlwg-synthetic.conf [85] 90-synthetic.conf * [86] 90-ttf-arphic-ukai-embolden.conf [87] 90-ttf-arphic-uming-embolden.conf [88] 99-language-selector-zh.conf
现在系统的字体配置应该可以满足用户的日常使用需求了。可以安装浏览器访问一下中文和英文网站测试一下显示效果。
$ emerge -av firefox-bin $ sudo ln -fs /usr/bin/firefox-bin /usr/local/bin/firefox
可以用右键菜单的(Web Browser)启动Firefox。
设置桌面背景。
右键菜单中选择(Preferences)->Choose Wallpaper启动nitrogen。为它指定包含桌面图片的文件加,然后选择设置桌面即可。
配置退出Openbox的方法。
前文中安装个的oblogout软件包可以满足大部分用户“退出”系统的需求。它可以画一个非常漂亮的logout界面,供用户选择突出方法。我们想做的就是把它弄得酷一点。给/etc/oblogout.conf做如下修改。
--- /etc/._cfg0000_oblogout.conf 2012-11-13 23:20:22.178125356 +0900 +++ /etc/oblogout.conf 2012-11-07 00:38:04.146159134 +0900 @@ -6,8 +6,8 @@ [looks] opacity = 70 bgcolor = black -buttontheme = oxygen -buttons = cancel, logout, restart, shutdown, suspend, hibernate, lock +buttontheme = foom +buttons = cancel, logout, restart, shutdown, hibernate, lock [shortcuts] cancel = Escape @@ -26,4 +26,4 @@ # safesuspend = safesuspend lock = xtrlock & # switchuser = gdm-control --switch-user -logout = openbox --exit +logout = /usr/local/bin/oblogout.sh
然后,制作一个Openbox退出时的杀手脚本。内容如下,放入/usr/local/bin/oblogout.sh,并给它可执行权限。
## kill all apps in a openbox session killall -s 9 -u $(whoami) conky pulseaudio volumeicon ## exit openbox openbox --exit
$ sudo chmod a+x /usr/local/bin/oblogout.sh
右键菜单中选择(EXIT),然后选择logout退出Openbox回到终端。重新启动Openbox。基本上,可以开始享受这个全新的轻量级桌面了!
参考文档:
- 标签: configuration, Desktop, linux, openbox
- 分类:Linux tips
- 暂无评论
以Funtoo为基础的Linux桌面系统(5)
Here comes Openbox!
选择一个窗口管理器需要很多理由吗?不需要吗!?当你了解到相对与Gnome和KDE长达数小时上百个软件包的编译过程,Openbox简单明了的只需要十几分钟的编译时间时,也许你已经有了明确的答案。当你知道相对与庞大冗余的桌面环境拖跨你的老机器,而Openbox支持的现代桌面系统仅仅需要不到500M内存占用的常时运行状态时,也许这已经变的不是一个问题。
让自己的操作系统拥有一个简单的结构还有其他诸多好处。第一,个人的精力其实非常有限——尤其当你已经30岁并且托家带口的时候应该对此有明显感受,如果你跟我一样偏执的需要对计算机“掌握一切”的时候,简单的系统结构通常能够帮你省掉不少麻烦。第二,复杂的软件是一种浪费。我一直都怀疑“高大全”应该成为一款软件成功与否的衡量标准。事实上也很难有一款软件或者一个操作系统能够满足所有用户的需求,通常情况是用户仅仅需要一个庞大软件中的20%的功能。第三,过度复杂的软件通常会把“自己动手”的用户拒之门外,让你失去为自己写工具的冲动。这有时候对程序员来说是一种莫大的损失。
所以,在这个系列中我想做的只有一件事——利用Funtoo作为基础制造一个扩展性良好的简洁的桌面系统。
「Workers of all lands, Unite!」
安装窗口管理器和他的合作伙伴们。
$ emerge -av openbox obconf oblogout `: Openbox Components ` \
xcompmgr `: X-Composer ` \
tint2 `: Panel ` \
conky `: System Monitor ` \
dmenu gmrun `: Commandors ` \
gtk-engines-murrine `: Gtk Engines for gtk-2 ` \
gtk-engines-unico `: Gtk Engines for gtk-3.0 ` \
xscreensaver `: Screen Locker ` \
x11-misc/nitrogen `: Desktop Drawer ` \
media-gfx/gpicview `: Picture Viewer ` \
geany `: Editor `
整个桌面系统哦需要很多部件。以上的命令中的注释已经说明了各个部件的作用。需要注意的是,tint2和conky都需要graphics的compsiting支持,X系统本身不提供这种能力,需要额外的软件库帮助完成这个操作。Compositing的主要作用就是将各个应用程序图形要素组装起来然后将合成后的图形显示要求转发给X服务器。这有这样才能在实现一些阴影透明和动画效果。这个组合中,xcompmgr就是compositor。
这些组件编译完成后,在采用默认配置的情况下测试一下。
$ echo "exec openbox-session" >> ~/.xinitrc
如果一切顺利,你会看到openbox启动。在桌面的任何空白区域点鼠标右键,你可以看到一个应用程序列表——这是openbox为启动大多数常用程序提供的快捷方式。
- 标签: Desktop, linux, openbox, opensource
- 分类:Linux tips
- 仅一条评论
