十月天梯赛训练补题 10.31
作者:互联网
A - a HDU - 4442
解题思路:假设有两个队伍a和b,如先去排a,则总体等待时间为:
ax+ax*by+bx,如先去排b,则总体的等待时间为bx+bx*ay+ax。
我们假设a在前优,则:ax*by<ay*bx。由此推广到多个队伍,按照ax*by<ay*bx的标准排序后所得的顺序处理即为答案。
代码:
1 #include <set> 2 #include <map> 3 #include <list> 4 #include <stack> 5 #include <queue> 6 #include <deque> 7 #include <cmath> 8 #include <string> 9 #include <vector> 10 #include <cstdio> 11 #include <cstring> 12 #include <cstdlib> 13 #include <sstream> 14 #include <iostream> 15 #include <algorithm> 16 //#include <unordered_map> 17 #define INF 0x3f3f3f3f 18 #define ll long long 19 #define ull unsigned long long 20 #define FILL(a,n,v) fill(a,a+n,v) 21 #define Mset(a,v) memset(a,v,sizeof a) 22 #define Mcpy(a,b) memcpy(a,b,sizeof b) //a=b 23 #define fcio ios::sync_with_stdio(false); cin.tie(0); cout.tie(0) 24 using namespace std; 25 const int mod=365*24*60*60; 26 const int maxn=1e5+10; 27 int n; 28 struct node 29 { 30 ll a; 31 ll b; 32 }arr[maxn]; 33 34 bool cmp(node a,node b) 35 { 36 return a.a*b.b<b.a*a.b; 37 } 38 39 int main() 40 { 41 while(cin>>n&&n) 42 { 43 for(int i=0;i<n;i++) cin>>arr[i].a>>arr[i].b; 44 sort(arr,arr+n,cmp); 45 ll t=0; 46 for(int i=0;i<n;i++) 47 { 48 t+=arr[i].a+t*arr[i].b; 49 t%=mod; 50 } 51 cout<<t<<endl; 52 } 53 }
B - b HDU - 3791
题意:
给出输入序列判断是否为同一棵二叉搜索树。
代码:
1 #include <iostream> 2 #include <queue> 3 #include <stack> 4 using namespace std; 5 const int maxn=1e5+10;; 6 7 struct node 8 { 9 int value; 10 node *l,*r; 11 12 node() 13 { 14 this->l=NULL; 15 this->r=NULL; 16 } 17 18 node(int v) 19 { 20 this->value=v; 21 this->l=NULL; 22 this->r=NULL; 23 } 24 }; 25 26 class binarySearchTree 27 { 28 public: 29 node* root; 30 /** 31 二叉搜索树建树 32 @a 输入数组 a[0]为根结点 33 @n 数组a的长度 34 */ 35 void buildTree(int a[],int n) 36 { 37 this->root=new node(a[0]); 38 for(int i=1;i<n;i++) 39 { 40 node *now=new node(a[i]); 41 node *fa=this->root; 42 while(1) 43 { 44 if(now->value<fa->value) 45 { 46 if(fa->l==NULL) 47 { 48 fa->l=now; 49 break; 50 } 51 else fa=fa->l; 52 } 53 else 54 { 55 if(fa->r==NULL) 56 { 57 fa->r=now; 58 break; 59 } 60 else fa=fa->r; 61 } 62 } 63 } 64 } 65 /** 66 层序遍历序列 67 返回一个数组 68 */ 69 int* getLevelOrder() 70 { 71 int* a=new int[maxn]; 72 int cnt=0; 73 queue<node>q; 74 q.push(*this->root); 75 while(!q.empty()) 76 { 77 node now=q.front(); 78 a[cnt++]=now.value; 79 q.pop(); 80 if(now.l) q.push(*now.l); 81 if(now.r) q.push(*now.r); 82 } 83 return a; 84 } 85 /** 86 先序遍历序列 87 返回一个数组 88 */ 89 int* getPreOrder() 90 { 91 int* a=new int[maxn]; 92 int cnt=0; 93 node *now=this->root; 94 stack<node*>st; 95 while(now||st.size()) 96 { 97 while(now) 98 { 99 a[cnt++]=now->value; 100 st.push(now); 101 now=now->l; 102 } 103 if(st.size()) 104 { 105 now=st.top(); 106 st.pop(); 107 now=now->r; 108 } 109 } 110 return a; 111 } 112 /** 113 中序遍历序列 114 返回一个数组 115 */ 116 int* getInOrder() 117 { 118 int* a=new int[maxn]; 119 int cnt=0; 120 node *now=this->root; 121 stack<node*>st; 122 while(now||st.size()) 123 { 124 while(now) 125 { 126 st.push(now); 127 now=now->l; 128 } 129 if(st.size()) 130 { 131 now=st.top(); 132 st.pop(); 133 a[cnt++]=now->value; 134 now=now->r; 135 } 136 } 137 return a; 138 } 139 /** 140 后序遍历序列 141 返回一个数组 142 */ 143 int* getPostOrder() 144 { 145 int* a=new int[maxn]; 146 int cnt=0; 147 node* now=this->root; 148 stack<node*>st1; 149 stack<node*>st2; 150 while(now||st1.size()) 151 { 152 while(now) 153 { 154 st1.push(now); 155 st2.push(now); 156 now=now->r; 157 } 158 if(st1.size()) 159 { 160 now=st1.top(); 161 st1.pop(); 162 now=now->l; 163 } 164 } 165 while(st2.size()) 166 { 167 now=st2.top(); 168 st2.pop(); 169 a[cnt++]=now->value; 170 } 171 return a; 172 } 173 }; 174 175 int main() 176 { 177 int n; 178 while(cin>>n&&n) 179 { 180 string s; 181 cin>>s; 182 int a[maxn]; 183 int b[maxn]; 184 for(int i=0;i<s.size();i++) a[i]=s[i]-'0'; 185 186 binarySearchTree t; 187 t.buildTree(a,(int)s.size()); 188 int* pre1=t.getLevelOrder(); 189 190 while(n--) 191 { 192 cin>>s; 193 for(int i=0;i<s.size();i++) b[i]=s[i]-'0'; 194 t.buildTree(b,(int)s.size()); 195 int* pre2=t.getLevelOrder(); 196 197 bool flag=true; 198 for(int i=0;i<s.size();i++) 199 { 200 if(pre1[i]!=pre2[i]) 201 { 202 flag=false; 203 break; 204 } 205 } 206 if(flag) cout<<"YES"<<endl; 207 else cout<<"NO"<<endl; 208 } 209 210 211 } 212 213 return 0; 214 }
标签:node,now,10.31,int,st,while,补题,天梯,include 来源: https://www.cnblogs.com/lihahahahaji/p/13909420.html