博客

  • Chrome里的音乐播放器

      话说我是一个疯狂的音乐听众,总是喜欢在上网的时候听听歌,而且Windows和Linux两个系统喜欢过来切换过去,特别是现在,Linux的使用率不比Windows低到哪里去,Linux中又没有QQ音乐,就只好另辟蹊径,首先我使用的是SOSO的音乐播放器,因为能和QQ音乐的列表同步,用了一阵子弊端很快就显现了,不能够自动登录,每次都需要手工登录,而且比较耗资源,怎么办呢?这时看到了谷奥里推荐了一款音乐盒,很好用,不需要专门去占用标签,但是弊端也很快就显示出来了,因为不能同步,很快就又换了。换成了谷歌自己的音乐盒的能够同步,可以自动登录,但是要单独占一个标签也是烦人事儿,我喜欢简洁(不然就不用Chrome了)。后来谷奥又推荐了一款插件,还没有使用,使用之后再评析看看。

  • Linux磁盘操作相关指令

     

    鸟哥Linux私房菜基础篇第八章《Linux磁盘于文件系统管理》的命令总结:
     
    fdisk #对硬盘进行分区
      非常好用的工具,有自己的界面,操作都比较简单
    fdisk -l #显示所有硬盘以及它们的分区
      这个比较方便,查看/dev/下的文件的技术含量高了,df又不能显示未挂载的分区
    partrobe #让内核重新读取分区表信息
      这个感觉挺方便的,不用重启,但是很难用到。
    mkfs -t XX xxx #将xxx格式化成XX
    mke2fs #格式化成ext2, ext3的工具
    fsck #检查磁盘错误的命令
      别人都说很有用,但是我的Linux坏了几次,因为停电,修复之后总是用不了,进不了Linux,而是grub,知道是我学艺不精,不是这个指令不好用。
     
    mount -t xx AAA BBB #将xx格式的AAA磁盘挂载在BBB
    mount -a #按照/etc/fstab挂载磁盘
    mount -o #可以设置挂载分区的属性: 只读,读写;是否使用异步技术等..
    mount -o remount,xxx BBB #如上, 但是按照xxx的属性重新挂载BBB
    mount -L “XX” YY #将Label为XX的分区挂哉到YY上.
    mount -o loop xxx/xxx.iso yyy #将xxx.iso文件挂载到yyy中来
    umount #取消挂载
     
    dumpe2fs /dev/XXX #查看XXX分区的相关信息(Super block和Block group)
      用这个了解磁盘的信息挺好的,-h只显示Super block中的信息。
     
    磁盘参数相关:
    mknod /dev/xxx b 主硬件号 幅硬件号 #手动捕捉硬件文件(/dev/*)
    e2label 装置名称 新的Label名称 #修改分区(仅限ext2, ext3, ext4)的Label
    tune2fs #对ext2/ext3/ext4的各种操作, 详情参考man/info
    hdparm #修改IDE硬盘的参数, 不懂的话千万不要乱动, 搞不好废了你的硬盘. 这个指令现在多用来测试性能.
    /etc/fstab #开机挂载挂载的设置
    /etc/mtab /proc/mounts #记录的是已挂载的文件系统
    mkswap 分区名 #将分区格式化成swap
    swapon -s #列出目前使用的swap分区
    swapon 设备名 #使用该设备作为swap
    swapoff 设备名 #取消使用该设备作为swap
    parted #对2TB以上的硬盘进行分区
    free #查看swap和内存的使用情况
  • Linux下弹出U盘的代码

    在linux下,对于usb设备,我们一般都是mount上使用,不使用时umount掉就可以了。 在ubuntu10.04中,当我们插入u盘时,会出现u盘设备,当我点击这个设备就可以mount上u盘,并读取里面的文件,当我们不使用时,我们再次点击这个设备就可以弹出这个设备,如果想再次使用U盘,那么就得必须再次插拔u盘才可以。 umount和弹出u盘是不同的,umount后我们还可以再次mount上使用,我们的u盘的设备还在,但弹出u盘后,我们想使用就的再此插入u盘才可以。例如,我有个u盘,设备是sdb,里面有个分区sdb1,在弹出u盘后,我们使用fdisk来列出磁盘时就不会在看到sdb的设备了。 在linux下弹出u盘我们可以使用如下命令(例如我的u盘设备是sdb1): de lang="bash">sudo eject -s /dev/sdb1de> 这里可以查看eject的代码,提取出来就成这样了: de lang="c">#include #include #include #include #include #include #include #include #include #include #include #include int main(int argc, char argv[]) { int fd = -1; char device; if (argc != 2) { printf("usage: usb-s /dev/sde1"); return -1; } device = strdup(argv[1]); if ((fd = open(device, O_RDONLY | O_NONBLOCK)) <0> 编译:de lang="bash">g++ -g -Wall main.cpp -o usb-sde> 现在,我们要弹出sdb1的u盘的话就可以这样了。 de lang="bash">sudo usb-s /dev/sdb1de>

  • USACO 2.2.4 Party Lamps 解题报告

    初看到题目,十个有九个人想用暴力枚举又不知道何从下手吧,哈哈,其实你把这几种按钮的所有组合在一起尝试一下可以清晰地发现只有八种情况,而且只用保存前6位数字就够了,因为后面都是循环的,啥?看不懂这鬼解题报告?话说其实这题你看代码最直截了当: de lang="c">/ LANG: C ID: yylogoo1 PROG: lamps / #include int lamps[8][6] = { {0, 0, 0, 0, 0, 0}, //(<1>= 1){ add(0); add(2); add(5); } if(c <= 2){ add(1); add(4); add(6); add(7); } if(c <= 3){ add(3); } scanf("%d", &i); while(i != -1){ for(j = 0; j <8 j ifansj getj i="= 0){" ansj="0;" scanfd i scanfd i whilei="-1){" forj="0;" j j ifansj getj i="= 1){" ansj="0;" scanfd i fori="0;" i i ifansi k="0;" forj="1;" j="n;" j printfd geti j printfn ifk printfIMPOSSIBLEn return code>

  • USACO 2.2.3 Runaround Numbers 解题报告

    这题首先是一个枚举,从输入的数加一开始每个数字都看是不是题目所要的数。判断方法如下: 先把数字用字符串保存起来,然后读取一个数字并且标记为’x’,再读取一个,判断是否为’x’,如果为x就不是要求的数字,如果不是就继续读取,直到每个数字都被读取了,并且最后指针回到了第一个位置,那么这就是所需要的那个数字。因该说清楚了吧,简单的说就是模拟一边,代码如下: de lang="c"> / LANG: C ID: yylogoo1 PROG: runround / #include #include int check(int n) { int len, i, j, t; int used[10]; char num[10]; memset(used, 0, sizeof(used)); sprintf(num, "%d", n); len = strlen(num); for(i = 0; i

  • USACO 2.2.2 Subset Sums 解题报告

    这一题是一个动态规划题,f[i][j]是i个数字(1, 2, 3, 4, .., i)能够组成和为i的个数,那么方程式是f[i][j] = {f[i – 1][j – k] + f[i – 1][j]} (1 <= k <= i),再DP就是的,代码如下: / LANG: C ID: yylogoo1 PROG: subset / #include long long f[781]; int main(void) { int n, i, j, k; int max = 0; freopen("subset.in", "r", stdin); freopen("subset.out", "w", stdout); scanf("%d", &n); if(((n + 1) n / 2) & 1){ printf("0\n"); return 0; } f[0] = 1; for(i = 1; i = i; j--){ f[j] += f[j - i]; } } printf("%ld\n", f[(n + 1) n / 4] / 2); return 0; }

  • USACO 2.2.1 Preface Numbering 解题报告

    这题一开始确实会感觉很难,但是罗马数字的个位只有可能是{"I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"},同理,十位上的数字也永远都是固定的,所以还是简单吧,实现代码如下: / LANG: C ID: yylogoo1 PROG: preface / #include char num[4][10][5] = { {"", "I", "II", "III", "IV", "V", "VI", "VII", "VIII", "IX"}, {"", "X", "XX", "XXX", "XL", "L", "LX", "LXX", "LXXX", "XC"}, {"", "C", "CC", "CCC", "CD", "D", "DC", "DCC", "DCCC", "CM"}, {"", "M", "MM", "MMM"}}; int have[7]; void addnum(int n) { int i = 0; char s; while(n){ s = num[i][n % 10]; while(s != '\0'){ switch(*s){ case 'I': have[0]++; break; case 'V': have[1]++; break; case 'X': have[2]++; break; case 'L': have[3]++; break; case 'C': have[4]++; break; case 'D': have[5]++; break; case 'M': have[6]++; break; } s++; } i++; n /= 10; } } char st[7] = {'I', 'V', 'X', 'L', 'C', 'D', 'M'}; int main(void) { int n; int i; freopen("preface.in", "r", stdin); freopen("preface.out", "w", stdout); scanf("%d", &n); for(i = 1; i 0){ printf("%c %d\n", st[i], have[i]); } } return 0; }

  • USACO 2.1.5 Hamming Codes 解题报告

    这题的话,话说感觉就是一个暴力的枚举,没多余要考虑的,一方面对所有整数开始枚举,设当前枚举的是i,那么在用i和所有已知的海明码进行比较,海明距离大于等于D的话就成为一个新的海明码,一直枚举出N个海明码。 得出海明距离也很简单,就从第一个位开始,一个不同的就记录一下,我直接把8位都枚举一次,所以B这个数据对我却是没有用,代码如下: de lang="c">/ LANG: C ID: yylogoo1 PROG: hamming / #include int num[64]; int count = 0; int ham(int a, int b) { int c = 0 ; int i; for(i = 0; i <8 i ifa="(b" c a><= 1, b <<= 1; } return c; } int main(void) { int n, b, d; int i, j; freopen("hamming.in", "r", stdin); freopen("hamming.out", "w", stdout); scanf("%d%d%d", &n, &b, &d); for(i = 0; count != n; i++){ for(j = 0; j de>

  • USACO 2.1.4 Healthy Holsteins 解题报告

    咋一看,真是一个爆难的题目,但是仔细一想,其实也很简单,怎么个简单呢?对于每种食物来说,只有两种选择:吃或不吃,对吧,暴力枚举就是,只有2^15种方案,虽然数字还是非常大的,但是一秒钟的时限还是超不了,代码晚点发,在Linux下。 代码来了: / ID: yylogoo1 PROG: holstein LANG: C / #include #include int have[15][25]; int need[25]; int v, g; int got[25]; int used[15], ans[15]; int tot = 26, tmp; void check(void) { int i; if(tot tmp){ tot = tmp; memcpy(ans, used, sizeof(used)); }else if(tot == tmp){ for(i = 0; i ans[i]){ tot = tmp; memcpy(ans, used, sizeof(used)); return; }else if(used[i] <ans i return void srchint now int i check ifnow="= g){" return srchnow tmp usednow="1;" fori="0;" i v i goti="have[now][i];" srchnow tmp-- usednow="0;" fori="0;" i v i goti -="have[now][i];" int mainvoid int i j freopenholsteinin r stdin freopenholsteinout w stdout scanfd v fori="0;" i v i scanfd needi scanfd g fori="0;" i g i forj="0;" j v j scanfd haveij srch printfd tot fori="0;" i g i ifansi printf d i printfn return code>

  • USACO 2.1.3 Sorting A Three-Valued Sequence 解题报告

    首先用两个数组分别保存排了序的数组和没排序的数组,然后再根据这两个判断,当前这个位置上应该是放什么数,而实际上放的是什么数,如果两个位置上需要的都正好是对方所有的,那么这是最好的,进行循环,把所有这种的都交换掉,然后累计交换次数。 但是最后会有这么一种情况,三个位置需要的分别是1, 2, 3,而他们有的分别是3, 1, 2,这时就要交换两次了,而且仔细考虑的话会发现当前面循环完了之后,就只可能剩下这么一种情况了,当然,对数可能不止一对,所以就累计需要的和拥有的不相同的那些,统计起来,处以三再除以二,就是交换次数,结果就出来了。 代码如下: / ID: yylogoo1 PROG: sort3 LANG: C / #include int n; int have[1000]; int need[1000]; int com(void const a, void const b) { return (int )a - (int )b; } int ans; int main(void) { int i, j; freopen("sort3.in", "r", stdin); freopen("sort3.out", "w", stdout); scanf("%d", &n); for(i = 0; i