【九度】2014年王道论坛研究生机试练习赛第二场解题报告

1、 题目1470:调整方阵
时间限制:1 秒内存限制:128 兆特殊判题:否提交:1001解决:426
题目描述:
输入一个N(N<=10)阶方阵,按照如下方式调整方阵:
1.将第一列中最大数所在的行与第一行对调。
2.将第二列中从第二行到第N行最大数所在的行与第二行对调。
依此类推...
N-1.将第N-1列中从第N-1行到第N行最大数所在的行与第N-1行对调。
N.输出这个方阵
输入:
包含多组测试数据,每组测试数据第一行为一个整数N,表示方阵的阶数.
接下来输入这个N阶方阵.
输出:
调整后的方阵
样例输入:
4
3 6 8 7
6 7 5 3
8 6 5 3
9 8 7 2
样例输出:
9 8 7 2
6 7 5 3
3 6 8 7
8 6 5 3
来源:
2011年西北工业大学计算机研究生机试真题
解题思路
       题目其实是要求从第i行开始依次判断,当前列i中,从i到n行中求最大的数所在的行,然后交换当前行i和最大行。
       扫描一遍即可搞定。

Java AC

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
 
public class Main {
    /*
     * 1053
     */
    public static void main(String[] args) throws IOException {
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(
                new InputStreamReader(System.in)));
        while (st.nextToken() != StreamTokenizer.TT_EOF) {
            int n = (int) st.nval;
            int matrix[][] = new int[n][n];
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n; j++) {
                    st.nextToken();
                    matrix[i][j] = (int) st.nval;
                }
            }
            for (int j = 0; j < n; j++) {
                int maxValue = matrix[j][j];
                int maxCol = j;
                for (int i = j+1; i < n; i++) {
                    if (matrix[i][j] > maxValue) {
                        maxValue = matrix[i][j];
                        maxCol = i;
                    }
                }
                for (int i = 0; i < n; i++) {
                    int temp = matrix[j][i];
                    matrix[j][i] = matrix[maxCol][i];
                    matrix[maxCol][i] = temp;
                }
            }
            for (int i = 0; i < n; i++) {
                for (int j = 0; j < n-1; j++) {
                    System.out.print(matrix[i][j]+ " ");
                }
                System.out.print(matrix[i][n-1]);
                System.out.println();
            }
        }
    }
 
}
/**************************************************************
    Problem: 1470
    User: wzqwsrf
    Language: Java
    Result: Accepted
    Time:100 ms
    Memory:14868 kb
****************************************************************/
C++ AC

#include <stdio.h>
const int maxn = 12;
int matrix[maxn][maxn];
int n,i,j;
 
int main(){
    while(scanf("%d",&n) != EOF){
        for(i = 0; i < n; i++){
            for(j = 0; j < n; j++){
                scanf("%d",&matrix[i][j]);
            }
        }
        for (j = 0; j < n; j++) {
            int maxValue = matrix[j][j];
            int maxCol = j;
            for (i = j+1; i < n; i++) {
                if (matrix[i][j] > maxValue) {
                    maxValue = matrix[i][j];
                    maxCol = i;
                }
            }
            for (i = 0; i < n; i++) {
                int temp = matrix[j][i];
                matrix[j][i] = matrix[maxCol][i];
                matrix[maxCol][i] = temp;
            }
        }
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n-1; j++) {
                printf("%d ",matrix[i][j]);
            }
            printf("%d",matrix[i][n-1]);
            printf("\n");
        }
    }
    return 0;
}
 
/**************************************************************
    Problem: 1470
    User: wangzhenqing
    Language: C++
    Result: Accepted
    Time:0 ms
    Memory:1020 kb
****************************************************************/
2、 题目1549:货币问题

时间限制:1 秒内存限制:128 兆特殊判题:否提交:430解决:240
题目描述:
已知有面值为1元,2元,5元,10元,20元,50元,100元的货币若干(可认为无穷多),需支付价格为x的物品,并需要恰好支付,即没有找零产生。
求,至少需要几张货币才能完成支付。
如,若支付价格为12元的物品,最少需要一张10元和一张2元,即两张货币就可完成支付。
输入:
输入包含多组测试数据,每组仅包含一个整数p(1<=p<=100000000),为需支付的物品价格。
输出:
对于每组输入数据,输出仅一个整数,代表最少需要的货币张数。
样例输入:
10
11
13
样例输出:
1
2
3
来源:
2014年王道论坛研究生机试练习赛(二)
       一开始就想多了,以为是完全背包,不过看题目的分数,应该没那么难。
       其实笨想,钱币如果越多,那么需要的张数越小。

Java AC

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
 
public class Main {
    /*
     * 1053
     */
    public static void main(String[] args) throws IOException {
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(
                new InputStreamReader(System.in)));
        while (st.nextToken() != StreamTokenizer.TT_EOF) {
            int p = (int) st.nval;
            int num = 0;
            int array[] = {100,50,20,10,5,2,1};
            for (int i = 0; i < 7; i++) {
                if (p >= array[i]) {
                    num += p / array[i];
                    p = p % array[i];
                }
            }
            System.out.println(num);
        }
    }
}
 
/**************************************************************
    Problem: 1549
    User: wzqwsrf
    Language: Java
    Result: Accepted
    Time:430 ms
    Memory:14872 kb
****************************************************************/
C++ AC

#include <stdio.h>
 
int main(){
    int p;
    while(scanf("%d",&p) != EOF){
        int array[7] = {100,50,20,10,5,2,1};
        int num = 0;
        for(int i = 0; i < 7; i++){
            if(p >= array[i]){
                num += p / array[i];
                p %= array[i];
            }
        }
        printf("%d\n",num);
    }
    return 0;
}
 
/**************************************************************
    Problem: 1549
    User: wangzhenqing
    Language: C++
    Result: Accepted
    Time:30 ms
    Memory:1020 kb
****************************************************************/

3、 题目1493:公约数
时间限制:1 秒内存限制:128 兆特殊判题:否提交:3267解决:565
题目描述:
给定两个正整数a,b(1<=a,b<=100000000),计算他们公约数的个数。
如给定正整数8和16,他们的公约数有:1、2、4、8,所以输出为4。
输入:
输入包含多组测试数据,每组测试数据一行,包含两个整数a,b。
输出:
对于每组测试数据,输出为一个整数,表示a和b的公约数个数。
样例输入:
8 16
22 16
样例输出:
4
2
来源:
2013年王道论坛计算机考研机试全真模拟考试
        公约数,没啥说的,求最大公约数,然后依次判断即可。

Java AC

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
 
public class Main {
    /*
     * 1053
     */
    public static void main(String[] args) throws IOException {
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(
                new InputStreamReader(System.in)));
        while (st.nextToken() != StreamTokenizer.TT_EOF) {
            int a = (int) st.nval;
            st.nextToken();
            int b = (int) st.nval;
            int c = gcd(a, b);
            int num = 0;
            int i = 1;
            for(; i * i < c; i++){  
                 if(c % i == 0){  
                     num += 2;
                 }
            }
            if(c == i * i){  
                 num += 1;
             }
            System.out.println(num);
        }
    }
 
    private static int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);  
    }
}
/**************************************************************
    Problem: 1493
    User: wzqwsrf
    Language: Java
    Result: Accepted
    Time:290 ms
    Memory:15992 kb
****************************************************************/
C++ AC

#include <stdio.h>
int a,b;
 
int gcd(int x, int y){
    int temp;
    while(y > 0){
        temp = x % y;
        x = y;
        y = temp;
    }
    return x;
}
int main(){
    while(scanf("%d %d",&a, &b) != EOF){
        int c = gcd(a,b);
        int num = 0;
        int i = 1;
        for(; i*i < c; i++){
            if(c % i == 0){
                num += 2;
            }
        }
        if(i * i == c){
            num += 1;
        }
        printf("%d\n",num);
    }
    return 0;
}
 
/**************************************************************
    Problem: 1493
    User: wangzhenqing
    Language: C++
    Result: Accepted
    Time:10 ms
    Memory:1020 kb
****************************************************************/
4、 题目1550:分糖果

时间限制:1 秒内存限制:128 兆特殊判题:否提交:486解决:86
题目描述:
给从左至右排好队的小朋友们分糖果,
要求:
1.每个小朋友都有一个得分,任意两个相邻的小朋友,得分较高的所得的糖果必须大于得分较低的,相等则不作要求。
2.每个小朋友至少获得一个糖果。
求,至少需要的糖果数。
输入:
输入包含多组测试数据,每组测试数据由一个整数n(1<=n<=100000)开头,接下去一行包含n个整数,代表每个小朋友的分数Si(1<=Si<=10000)。
输出:
对于每组测试数据,输出一个整数,代表至少需要的糖果数。
样例输入:
3
1 10 1
3
6 2 3
2
1 1
样例输出:
4
5
2
来源:
2014年王道论坛研究生机试练习赛(二)
        这个可以参考LeetCode中的 Candy,解题思路参考( LeetCode/Candy)

Java AC

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StreamTokenizer;
 
public class Main {
    /*
     * 1053
     */
    public static void main(String[] args) throws IOException {
        StreamTokenizer st = new StreamTokenizer(new BufferedReader(
                new InputStreamReader(System.in)));
        while (st.nextToken() != StreamTokenizer.TT_EOF) {
            int n = (int) st.nval;
            int[] ratings = new int[n];
            for (int i = 0; i < n; i++) {
                st.nextToken();
                ratings[i] = (int) st.nval;
            }
            System.out.println(candy(ratings));
        }
    }
 
    public static int candy(int[] ratings) {
        if (ratings == null || ratings.length == 0) {
            return 0;
        }
        int len = ratings.length;
        int candyNum[] = new int[len];
        for (int i = 0; i < len; i++) {
            candyNum[i] = 1;
        }
        for (int i = 1; i < len; i++) {
            if (ratings[i] > ratings[i - 1]) {
                candyNum[i] = candyNum[i - 1] + 1;
            }
        }
        for (int i = len - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1] && candyNum[i] <= candyNum[i + 1]) {
                candyNum[i] = candyNum[i + 1] + 1;
            }
        }
        int allCandy = 0;
        for (int i = 0; i < len; i++) {
            allCandy += candyNum[i];
        }
        return allCandy;
    }
}
/**************************************************************
    Problem: 1550
    User: wzqwsrf
    Language: Java
    Result: Accepted
    Time:1040 ms
    Memory:27216 kb
****************************************************************/

C++ AC

#include <stdio.h>
int n,i;
 
int candy(int *ratings) {  
    if(ratings == NULL || n == 0){  
        return 0;  
    }  
    int len = n;
    int *candyNum = new int[len];  
    for(i = 0; i < len; i++){  
        candyNum[i] = 1;  
    }  
    for(i = 1; i < len; i++){  
        if(ratings[i] > ratings[i-1]){  
            candyNum[i] = candyNum[i-1]+1;  
        }  
    }  
    for(i = len-2; i >= 0; i--){  
        if(ratings[i] > ratings[i+1] && candyNum[i] <= candyNum[i+1]){  
            candyNum[i] = candyNum[i+1]+1;  
        }  
    }  
    int allCandy = 0;  
    for(i = 0; i < len; i++){  
        allCandy += candyNum[i];  
    }  
    return allCandy;  
}  
int main(){
    while(scanf("%d",&n) != EOF){
        int *ratings = new int[n];
        for(int i = 0; i < n; i++){
            scanf("%d",&ratings[i]);
        }
        printf("%d\n",candy(ratings));
    }
    return 0;
}
 
/**************************************************************
    Problem: 1550
    User: wangzhenqing
    Language: C++
    Result: Accepted
    Time:70 ms
    Memory:1552 kb
****************************************************************/


你可能感兴趣的:(【九度】2014年王道论坛研究生机试练习赛第二场解题报告)