基础编程与技巧题(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)
-
有一个三个参数的递归函数w(a,b,c)
-
如果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)
-
-
由于三个整数的大小比较小,所以通过数组保存中间结果,即使用记忆化搜索方式,即打表计算,之后只要查阅就行了
程序代码:
#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; }

浙公网安备 33010602011771号