Uriel's Corner

Research Associate @ Harvard University / Research Interests: Computer Vision, Biomedical Image Analysis, Machine Learning
posts - 0, comments - 50, trackbacks - 0, articles - 594
    各种悲剧, 深刻感觉到... ... 成绩是王道, 比赛什么的都是浮云... ... 暑假好好啃DS和高数吧... ...

    再切套水题放松一下... ... 不过这套比起前面三年的还真不算很水的... ... 貌似现在HDU上的ZJU 2005-2011都切了... ...

1. 又一版 A+B
    这个A+B很水啦, 递归输出实现进制转换就行
//浙大计算机研究生复试上机考试-2008年 又一版 A+B
#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define I __int64

int m;
I a, b;

void print(I x) {
    
if(!x) return;
    print(x 
/ m);
    printf(
"%d", x % m);
}


int main() {
    
while(scanf("%d"&m), m) {
        scanf(
"%I64d %I64d"&a, &b);
        a 
+= b;
        
if(!a) printf("0");
        
else
            print(a);
        puts(
"");
    }

    
return 0;
}


2. 欧拉回路
    这题只是判欧拉回路是否存在, 不用输出欧拉回路的话就不用那个神奇的套圈法了
    根据欧拉回路条件, 首先图要连通(一开始WA了一次忘记这个条件了), 这个嘛, BFS一下就好了, 再判下是否每个结点度数都是偶数
//浙大计算机研究生复试上机考试-2008年 欧拉回路
#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define N 1010

int n, m, deg[N], f[N][N], vis[N], q[N * 2];

void BFS() {
    
int l, r, i;
    memset(vis, 
0sizeof(vis));
    q[
0= 1; vis[1= 1;
    l 
= 0, r = 1;
    
while(l < r) {
        
for(i = 1; i <= n; ++i) {
            
if(i != q[l] && !vis[i] && f[i][q[l]]) {
                vis[i] 
= 1;
                q[r
++= i;
            }

        }

        
++l;
    }

}


int main() {
    
int x, y, i;
    
while(scanf("%d"&n), n) {
        scanf(
"%d"&m);
        memset(deg, 
0sizeof(deg));
        memset(f, 
0sizeof(f));
        
for(i = 0; i < m; ++i) {
            scanf(
"%d %d"&x, &y);
            
if(!f[x][y]) {
                deg[x]
++;
                deg[y]
++;
                f[x][y] 
= f[y][x] = 1;
            }

        }

        BFS();
        
for(i = 1; i <= n; ++i) {
            
if(!vis[i] || deg[i] % 2break;
        }

        
if(i <= n) puts("0");
        
else
            puts(
"1");
    }

    
return 0;
}


3. 继续畅通工程
    继续prim模板题, 不解释
//浙大计算机研究生复试上机考试-2008年 继续畅通工程
#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#define N 110
#define INF 0x3f3f3f3f
#define min(x, y) (x < y ? x : y)

int n, ans, adj[N][N], lowcost[N], closest[N];

void prim(int c[][N]) {
    
bool s[N];
    s[
1= true;
    
for(int i = 2; i <= n; ++i) {
        lowcost[i] 
= c[1][i];
        closest[i] 
= 1;
        s[i] 
= false;
    }

    
for(int i = 1; i < n; ++i) {
        
int mi = INF, j = 1;
        
for(int k = 2; k <= n; ++k)
            
if(lowcost[k] < mi && !s[k]) {
                mi 
= lowcost[k];
                j 
= k;
            }

            s[j] 
= true;
            
for(int k = 2; k <= n; ++k)
                
if(c[j][k] < lowcost[k] && !s[k]) {
                    lowcost[k] 
= c[j][k];
                    closest[k] 
= j;
                }

    }

}


int main() {
    
int i, j, x, y, c, st;
    
while(scanf("%d"&n), n) {
        
for(i = 1; i <= n; ++i) {
            
for(j = 1; j <= n; ++j) {
                
if(i == j) continue;
                
else
                    adj[i][j] 
= adj[j][i] = INF;
            }

        }

        
for(i = 0; i < n * (n - 1/ 2++i) {
            scanf(
"%d %d %d %d"&x, &y, &c, &st);
            
if(!st) {
                adj[x][y] 
= adj[y][x] = min(adj[y][x], c);
            }

            
else
                adj[x][y] 
= adj[y][x] = 0;
        }

        prim(adj);
        ans 
= 0;
        
for(i = 1; i <= n; ++i) {
            ans 
+= lowcost[i];
        }

        printf(
"%d\n", ans);
    }

    
return 0;
}


4. 魔咒词典
    5000Ms的时限, 果断水过去了... ...
    2011.09.17 PS: 坑爹啊... 九度怎么都AC不能...
//浙大计算机研究生复试上机考试-2008年 魔咒词典
#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<algorithm>
using namespace std;
#define N 100010
#define Q 1010

struct M {
    
int mk, id, ans;
    
char name[25], s[100];
}
p[N], q[N];

bool cmp1(M a, M b) {
    
return strcmp(a.name, b.name) < 0;
}


bool cmp2(M a, M b) {
    
return strcmp(a.s, b.s) < 0;
}


int nq, id[Q];

int main() {
    
int i, j, n = 0, pos1, pos2;
    
char s[110];
    
while(gets(s), strcmp(s, "@END@")) {
        
for(i = 0; s[i] != '['++i);
        
for(j = ++i; s[j] != ']'++j);
        strncpy(p[n].name, 
&s[i], j - i);
        strncpy(q[n].name, 
&s[i], j - i);
        strcpy(p[n].s, 
&s[j + 2]);
        strcpy(q[n].s, 
&s[j + 2]);
        
++n;
    }

    sort(p, p 
+ n, cmp1);
    sort(q, q 
+ n, cmp2);
    scanf(
"%d"&nq);
    getchar();
    
for(i = 0; i < nq; ++i) {
        gets(s);
        
if(s[0== '['{
            s[strlen(s) 
- 1= '\0';
            
for(j = 0; j < n; ++j) {
                
if(!strcmp(p[j].name, &s[1])) {
                    puts(p[j].s);
                    
break;
                }

            }

            
if(j == n) puts("what?");
        }

        
else {
            
for(j = 0; j < n; ++j) {
                
if(!strcmp(q[j].s, s)) {
                    puts(q[j].name);
                    
break;
                }

            }

            
if(j == n) puts("what?");
        }

    }

    
return 0;
}


5. 毕业bg
    简单DP, 好久不写DP, 一点感觉都没有了... ... 还看了一下解题报告才搞出sample, dp数组NC开小了还WA了一次... ...
//浙大计算机研究生复试上机考试-2008年 毕业bg
#include<stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<algorithm>
using namespace std;
#define N 35

struct M {
    
int h, l, t;
}
p[N];

bool cmp(M a, M b) {
    
if(a.t != b.t) return a.t < b.t;
    
return a.h < b.h;
}


int n, mxt, dp[1010];

int main() {
    
int i, j;
    
while(scanf("%d"&n), n > 0{
        mxt 
= 0;
        memset(dp, 
0sizeof(dp));
        
for(i = 1; i <= n; ++i) {
            scanf(
"%d %d %d"&p[i].h, &p[i].l, &p[i].t);
            mxt 
= max(p[i].t, mxt);
        }

        sort(p 
+ 1, p + n + 1, cmp);
        
for(i = 1; i <= n; ++i) {
            
for(j = p[i].t; j >= p[i].l; --j)
                dp[j] 
= max(dp[j - p[i].l] + p[i].h, dp[j]);
            
for(j = p[i].t + 1; j <= mxt; ++j)
                dp[j] 
= max(dp[j], dp[j - 1]);
        }

        printf(
"%d\n", dp[mxt]);
    }

    
return 0;
}

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理