基础编程与技巧题(1~5)

2020/9/16

(1) 题目来源:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1164

本体是用软件的方法实现crc检验,实际使用中用硬件实现,以提高传送速度。

程序代码:

#include<iostream>
#define Generator 34943
using namespace std;


int main(){
    unsigned char c, flag;
    int count;
    union{
        unsigned int L;
        struct{
            unsigned char b1;
            unsigned char b2;
            unsigned char b3;
            unsigned char b4;
        }crc;
    }data;
    while (1){
        data.L = 0;//左移位运算
        count = 0;
        while (scanf("%c", &c) && c != '\n'){
            count++;
            data.L = ((data.L << 8) + c) % Generator;
            flag = c; 
        }
        data.L = ((data.L << 16) ) % Generator;
        if (data.L != 0){
            data.L = Generator - data.L;
        }
        if (count == 1 && flag == '#'){ break; }
        printf("%02X%02X\n", (int)data.crc.b2, (int)data.crc.b1);
    }
    return 0;
}

(2)

  1. 有一个三个参数的递归函数w(a,b,c)
  2.  
    如果a<=0,b<=0,c<=0那么返回1
  3.  
    ×如果a>20,b>20,c>20返回w(20,20,20)
  4.  
    *如果a<b,并且b<c返回w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c)
  5.  
    *否则返回w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1)
  6.  
     
  7.  由于三个整数的大小比较小,所以通过数组保存中间结果,即使用记忆化搜索方式,即打表计算,之后只要查阅就行了

程序代码:

#include<iostream>
using namespace std;
/*如果a<=0,b<=0,c<=0那么返回1
如果a>20,b>20,c>20返回w(20,20,20)
如果a<b,并且b<c返回w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c)
否则返回w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1)*/
int f[21][21][21];
int w(int a, int b, int c){
    if (a <= 0 || b <= 0 || c <= 0){
        return 1;
    }
    if (a > 20 || b > 20 || c > 20){
        return w(20, 20, 20);
    }
    //剪枝策略,前面计算的现在就不需要进行计算了
    if (f[a][b][c] > 0){ return f[a][b][c]; }
    if (a < b&&b < c){
        return w(a, b, c - 1) + w(a, b - 1, c - 1) - w(a, b - 1, c);
    }
    return w(a - 1, b, c) + w(a - 1, b - 1, c) + w(a - 1, b, c - 1) - w(a - 1, b - 1, c - 1);
}
int main(){
    int a, b, c;
    for (int i = 0; i <= 20; i++){
        for (int j = 0; j <= 20; j++){
            for (int k = 0; k <= 20; k++){
                f[i][j][k] = w(i,j,k);
            }
        }
    
    }

    while (scanf("%d %d %d", &a, &b, &c) != EOF){
        if (a == -1 && b == -1 && c == -1){
            return 0;
        }
        printf("w(%d,%d,%d)=", a, b, c);
        printf("%d\n", w(a, b, c));
    }

    system("pause");
    return 0;
}

(3)

//设置每个设备的功率数组为power[21],每一个设备的开关状态通过数组toggle[21]存储,开启设备后的最大总功率是max,实际总功率是sum
//对每一个设备的操作,(1)如果设备是开着的,则关掉,对应的toggle[i]=0,同时sum-power[i]
//(2)如果设备是关着的,则打开,对应的toggle[j]=1,同时sum+power[j],此时需要更新max
#include<iostream>
using namespace std;
#define maxN 21
int n, m, c;//
int power[maxN];
int toggle[maxN];
int main(){
    int k;
    int number=1;
    while (scanf("%d%d%d", &n, &m, &c) && (n || m || c)){
        for (int i = 1; i <= n; i++){
            scanf("%d", &power[i]);
        }
        memset(toggle, 0, sizeof(toggle));
        int max = 0, sum = 0;
        for (int i = 1; i <= m; i++){
            scanf("%d", &k);
            if (toggle[k]){
                toggle[k] = 0;
                sum -= power[k];
            }
            if (!toggle[k]){
                toggle[k] = 1;
                sum += power[k];
                if (max < sum){
                    max = sum;
                }
            }
        }
        printf("Sequence %d\n", number++);
        if (max>c){
            printf("Fuse was blown.\n");
        }
        else{
            printf("Fuse was not blown.\n");
            printf("maximal power consumption was %d amperes.\n", max);
        }
        printf("\n");
    }
    system("pause");
    return 0;
}

(4)挖矿题:优先队列,基于堆,创建方式priority_queue<int,vector<int>,greater<int>>q,创建的过程中可能提示greater不是模板,增加头文件#include<functional>

#include<iostream>
#include<queue>
#include<functional>
using namespace std;
priority_queue<int, vector<int>, greater<int>>q;
int main(){
    int s, w, c, k, m;
    while (scanf("%d%d%d%d%d", &s, &w, &c, &k, &m) == 5){
        while (!q.empty()){
            q.pop();
        }
        int n = 9999 / c + 1;
        for (int i = 1; i <= k; i++){
            q.push(i*m + s);
        }
        //当前机器人进去工作的时间
        int time = q.top();
        //甘特图的理解
        for (int i = 1; i < n; i++){
            q.pop();
            q.push(time + w + 2 * s);
            if (q.top() < time + w){
                time += w;
            }
            else{
                time = q.top();
            }
        }
        time += w + s;
        printf("%d\n", time);
    }
    system("pause");
    return 0;
}

参考:https://blog.csdn.net/wangws_sb/article/details/87972382

(5)三角形的判别

#include<iostream>
#include<cmath>
int main(){
    double a, b, c;
    int num = 1;
    while (scanf("%lf%lf%lf", &a, &b, &c) && (a || b || c)){
        printf("Triangle # %d\n", num++);
        if (c != -1 && (a > c || b > c)){
            printf("Impossible.\n");
            //continue;
        }
        else if (b == -1){
            printf("b=%.3lf\n\n", sqrt(c*c - a*a));
        }
        else if (a == -1){
            printf("a=%.3lf\n\n", sqrt(c*c - b*b));
        }
        else{
            printf("c=%.3lf\n\n", sqrt(a*a + b*b));
        }
    }
    system("pause");
    return 0;
}

 

posted @ 2020-09-16 22:38  goldstine  阅读(95)  评论(0)    收藏  举报