A - Snacktower(water)
题意:一个数字在,所有比他大的数放出来以前,不能被放出来。
思路:瞎搞就好了
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int INF = 0x3f3f3f3f; 4 const int maxn = 100000 + 5; 5 typedef long long LL; 6 typedef pair<int, int>pii; 7 8 int main() 9 { 10 priority_queue<int>que; 11 int n; 12 scanf("%d", &n); 13 int nn = n; 14 for(int i = 0; i < nn; i++) 15 { 16 int x; 17 scanf("%d", &x); 18 que.push(x); 19 if(x == n) 20 { 21 while(que.top() == n) 22 { 23 printf("%d ", que.top()); 24 que.pop(); 25 n--; 26 } 27 } 28 puts(""); 29 } 30 31 return 0; 32 }
B - The Queue
C - Garland(dfs)
题意:给你一棵树,每个结点上都有值,然后问你能不能把,整棵树根据值,断开两条边,平均分成三份。
思路:
第一次dfs,切掉一段,然后去边,再dfs一次就得到答案了。这题坑点比较多。如果找不到切点或者切点是根,显然是不行的。没考虑到。
用flag记录cut点而不是直接erase掉的原因是,erase一不小心 就会把迭代器弄乱掉,特别是这种搜索的写法中,要小心。
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int INF = 0x3f3f3f3f; 4 const int maxn = 1e6 + 5; 5 typedef long long LL; 6 typedef pair<int, int>pii; 7 8 9 set<int>G[maxn]; 10 int v[maxn]; 11 LL cnt[maxn]; 12 int flag; 13 LL sum; 14 int cut; 15 16 void dfs(int cur, int pa) 17 { 18 if(cur == flag) return; 19 if(cut != -1) return ; 20 21 cnt[cur] = v[cur]; 22 for(auto o : G[cur]) 23 { 24 dfs(o, cur); 25 cnt[cur] += cnt[o]; 26 } 27 28 if(cut == -1 && cnt[cur] * 3 == sum) 29 { 30 cut = cur; 31 flag = cur; 32 } 33 } 34 int main() 35 { 36 int n, root; 37 scanf("%d", &n); 38 sum = 0; 39 for(int i = 1; i <= n; i++) 40 { 41 int pa, val; 42 scanf("%d%d", &pa, &val); 43 if(pa == 0) root = i; 44 G[pa].insert(i); 45 v[i] = val; 46 sum += val; 47 } 48 49 flag = -1; 50 cut = -1; 51 dfs(root, -1); 52 53 54 if(cut == -1 || cut == root) 55 { 56 puts("-1"); 57 } 58 else 59 { 60 int temp = cut; 61 memset(cnt, 0, sizeof(cnt)); 62 cut = -1; 63 dfs(root, -1); 64 if(cut == -1 || cut == root) puts("-1"); 65 else printf("%d %d\n", temp, cut); 66 } 67 68 69 return 0; 70 }
D - Cartons of milk
时间: 2024-12-30 03:25:16