-
题目大意:有的货物不能被放进同一个容器里,所以在运输货物时,检查每个容器内是否包含不能放在一起的货物
-
思路一(超时了):用for循环一个一个找
- 用一个结构体数组存不能放在一起的货物(不会二维vector)
- 配对检查每个容器中是否有不能放一起的货物
- 知识点:
- 结构体:定义结构体数组时,<>里是结构体名称,不是变量名
- vector:若想输入数组的值,需要先初始化为0
- 代码:
#include <iostream> #include <string> #include <vector> #include <cctype> using namespace std; struct good_pair{ string good1; string good2; }; int main(){ // int n, m; int n, m, i, j, p; scanf("%d %d", &n, &m); vector<good_pair> list(n); // 定义结构体数组时,<>里是结构体名称,不是变量名;若想输入数组的值,需要先初始化为0 for(i = 0; i < n; i++) cin >> list[i].good1 >> list[i].good2; for(i = 0; i < m; i++){ int k; bool flag = true; scanf("%d", &k); vector<string> c(k); for(j = 0; j < k; j++) cin >> c[j]; for(p = 0; p < k - 1; p++){ int q = p + 1; while(q < k){ for(auto it:list){ if((c[p] == it.good1 && c[q] == it.good2) || (c[p] == it.good2 && c[q] == it.good1)){ printf("No\n"); flag = false; break; } } if(flag == false) break; q++; } if(flag == false) break; } if(flag == true) printf("Yes\n"); } return 0; }
-
思路二:空间换时间:用键值对和hash存储
- 用一个map存与每个货物不相容的其他货物
- 用一个hash存容器里的货物,若存在,则hash[good_id] = 1;
- 知识点:
- 避免超时的方法;
- map
- hash
- 初始化数组的方法
- 代码:
#include <iostream> #include <vector> #include <map> using namespace std; int main(){ int n, m, good1, good2; scanf("%d %d", &n, &m); map<int, vector<int>> list; for(int i = 0; i < n; i++){ // good list scanf("%d %d", &good1, &good2); list[good1].push_back(good2); list[good2].push_back(good1); } for(int i = 0; i < m; i++){ int k; bool flag = true; int hash[101100] = {0}; scanf("%d", &k); vector<int> container(k); for(int j = 0; j < k; j++){ // container scanf("%d", &container[j]); hash[container[j]] = 1; } for(int j = 0; j < k; j++) for(int p = 0; p < list[container[j]].size(); p++) if(hash[list[container[j]][p]] == 1){ // 存在不相容的货物 flag = false; break; } if(!flag) printf("No\n"); else printf("Yes\n"); } return 0; }
-
总结:
-
避免超时的方法:
- 用空间换时间:
hash
- 能用
map
直接找到对应的值,就别用for
循环一个一个找
- 不用
cin、cout
,用scanf()、printf()
; - 在循环里,可用提前用
break;
或return 0
退出; - 在
for
循环外面定义i
; - 如果使用
map
或set
超时了,不考虑排序的情况,可以用unordered_map
和unordered_set
- 用空间换时间:
-
我不会用二维的
vector
,一般都用结构体vector
; -
vector
:若想输入数组的值,需要先初始化为0; -
结构体:定义结构体数组时,vector<>里是结构体名称,不是变量名;
-
初始化数组元素的方法:
-
定义成全局变量,即将
int a[N]
放在main外,这样a所有元素都会被初始化为0; -
int a[10] = {0};
-
vector
的初始化:vector<int> a(10);
-
-
【PAT】1149 Dangerous Goods Packaging (25 分)
最新推荐文章于 2021-08-16 11:55:46 发布