摘要: 用列队,按顺序一个个发送信号,然后当一个节点所有信号都接受了c>0就加入列队,然后继续。。。。 网上题解应该比较多,我直接上代码吧:#include <stdio.h>#include <assert.h>#include <stdlib.h>#define QMAX 1000int dot[200];int map[200][200];int link[200][200];int count[200];int queue[QMAX];int rear, head;int in[200], out[200];void enqueue(int k){ i 阅读全文
posted @ 2011-07-21 22:49 zqynux 阅读(865) 评论(0) 推荐(0) 编辑
摘要: 这题和USACO里一题挺像的,具体那题是啥不记得了,反正暴力枚举就行,数据不大,代码如下:#include <stdio.h>#include <string.h>#include <stdlib.h>#define INF 0xFFFFFFF#define min(a, b) ((a)<(b)?(a):(b))int f[101];char str[101];char sub[100][101];int main(int argc, char **argv){ int i, j, k; int n, l; scanf("%s\n" 阅读全文
posted @ 2011-07-21 16:31 zqynux 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 直接使用了系统的排序,感觉有点作弊的感觉。。。代码:#include <stdio.h>#include <string.h>#include <stdlib.h>char str[10000][257];int com(const void *a, const void *b){ return strcmp(a, b);}int main(int argc, char **argv){ int i; int n; scanf("%d\n", &n); for(i = 0; i < n; i++){ scanf(" 阅读全文
posted @ 2011-07-21 16:18 zqynux 阅读(216) 评论(0) 推荐(0) 编辑
摘要: N比较小,暴力搜就行,代码如下:#include <stdio.h>#include <stdlib.h>int num[20];int ans = 0xFFFFFFF, n, m;int t;void srch(int now){ if(now == n){ if(t >= m && t < ans){ ans = t; } if(t == m){ printf("0\n"); exit(0); } return; } srch(now + 1); t += num[now]; srch(now + 1); t -= n 阅读全文
posted @ 2011-07-21 16:13 zqynux 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 贪心,转题解:很好的一道贪心。首先一个需要明确的问题就是因为要分成1*1的格子,所以每一条边肯定都要切,只不过是切的次数的多少有所不同。对于每一条纵边来说,它所需要切得次数等于在这条纵向边切之前的已经切的横边的次数。对于横边就看纵边。这样,一个很显然的想法就是让代价大的先切,这样的话满足代价大的切得次数少。把横边和纵边排个序,然后不断的维护ans即可。 代码:#include <stdio.h>#include <stdlib.h>int heng[2000], shu[2000];int ans;int com(const void *a, const void *b 阅读全文
posted @ 2011-07-21 11:54 zqynux 阅读(312) 评论(0) 推荐(0) 编辑