hw机试后感
hw机试后感
case1,简单,逗号隔开的数组,找出素数去重,排序
case2,动态规划,8个任务,分布式计算,给出每个任务的子任务数量和所需服务器数量,服务器数量必须全部满足才能运行一个大任务。
我将其抽象成图的最大路径查找,利用递归,最后因为判断条件未考虑全,时间只剩5min不想改了就直接教了,过了40%。
提交的代码
#include <iostream> using namespace std; struct task { int file_num, service_num; }; int n, files = 0, service = 0, max_files = 0; int sta[8], p = 0; task tasks[8]; void find_maxfiles(int a) { service += tasks[a].service_num; files += tasks[a].file_num; if(service == n && files > max_files) { max_files = files; service -= tasks[a].service_num; files -= tasks[a].file_num; } else if(service < n) { sta[p++] = a; int flag; for(int i = 0; i < 8; i++) { flag = 0; for(int j = 0; j < p; j++) if(sta[j] == i) { flag = 1; break; } if(flag == 1 || i == a) continue; find_maxfiles(i); } } p--; } int main() { tasks[0].file_num = 300; tasks[0].service_num = 20; tasks[1].file_num = 500; tasks[1].service_num = 30; tasks[2].file_num = 620; tasks[2].service_num = 50; tasks[3].file_num = 370; tasks[3].service_num = 30; tasks[4].file_num = 400; tasks[4].service_num = 50; tasks[5].file_num = 450; tasks[5].service_num = 30; tasks[6].file_num = 380; tasks[6].service_num = 40; tasks[7].file_num = 150; tasks[7].service_num = 10; cin >> n; if(n < 10) return 0; if(n >= 260) { cout << 3170; return 0; } n = n - n % 10; for(int i = 0; i < 8; i++) { files = 0; service = 0; p = 0; find_maxfiles(i); } cout << max_files; return 0; }
改进算法:考虑到如下情况:总数为260,加入除了其中一个需要50个服务器的任务外,其他服务器都满足,此时 n应为210;若n在210到260区间,也只能是输出满足210的条件;(未经过hw机试的测试用例验证,仅自己模拟数据,感觉应该能过)
#include <iostream> using namespace std; struct task { int file_num, service_num; }; int n, files = 0, service = 0, max_files = 0; int sta[8], p = 0; task tasks[8]; void find_maxfiles(int a) { service += tasks[a].service_num; if(service > n) { service -= tasks[a].service_num; return ; } files += tasks[a].file_num; if(service <= n) { if(files > max_files) { max_files = files; } sta[p++] = a; int flag; for(int i = 0; i < 8; i++) { flag = 0; for(int j = 0; j < p; j++) if(sta[j] == i) { flag = 1; break; } if(flag == 1 || i == a) continue; find_maxfiles(i); } service -= tasks[a].service_num; files -= tasks[a].file_num; } p--; } int main() { tasks[0].file_num = 300; tasks[0].service_num = 20; tasks[1].file_num = 500; tasks[1].service_num = 30; tasks[2].file_num = 620; tasks[2].service_num = 50; tasks[3].file_num = 370; tasks[3].service_num = 30; tasks[4].file_num = 400; tasks[4].service_num = 50; tasks[5].file_num = 450; tasks[5].service_num = 30; tasks[6].file_num = 380; tasks[6].service_num = 40; tasks[7].file_num = 150; tasks[7].service_num = 10; cin >> n; if(n < 10) return 0; if(n >= 260) { cout << 3170; return 0; } n = n - n % 10; for(int i = 0; i < 8; i++) { files = 0; service = 0; p = 0; find_maxfiles(i); } cout << max_files; return 0; }
case3:给出一个数组,要求按输入的命令做出操作,U a b k 为更新从下标a到下标b(含)的值为其的k次方。可能是超过64bit的大数,因此要对1234567891取余数; C a b为求下标a 到 b(含)的数的和,并输出。
原谅我太菜,之前ccf就卡在大数上面了,当时思路也有,最简单的,用string进行操作多次的加减操作,但怕时间复杂度太大,而且因为第二题刚开始打算偷鸡,浪费了半个小时,导致时间也不太够了,放弃了。
#笔试题目#