1161-1170
1161 Merging Linked Lists(25)
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
const int maxn = 1e5 + 1;
struct node{
int start, val, next;
}nums[maxn];
vector<node> v;
stack<node> s;
int main(){
int a1, b1, n;
cin >> a1 >> b1 >> n;
for(int i = 0; i <= n; i++){
int st, va, ne;
cin >> st >> va >>ne;
nums[st].start = st;
nums[st].val = va;
nums[st].next = ne;
}
int len1 = 0;
int a1_copy = a1;
while(a1_copy != -1){
s.push(nums[a1_copy]);
a1_copy = nums[a1_copy].next;
len1++;
}
//测试点3 n,m给的顺序不定
if(len1 * 3 > n){
int temp;
temp = a1;
a1 = b1;
b1 = temp;
//注意清空stack
while(!s.empty()){
s.pop();
}
while(a1 != -1){
s.push(nums[a1]);
a1 = nums[a1].next;
len1++;
}
}
int cnt = 0;
while(b1 != -1){
printf("%05d %d ", b1, nums[b1].val);
b1 = nums[b1].next;
cnt++;
if(cnt == 2){
cnt = 0;
if(!s.empty()){
node temp = s.top();
printf("%05d\n%05d %d ", temp.start, temp.start, temp.val);
s.pop();
}
}
if(b1 != -1){
printf("%05d\n", nums[b1].start);
}
}
cout << "-1";
}
1162 Postfix Expression(25)
#include<iostream>
using namespace std;
struct node{
string val;
node *left, *right, *father;
node(){
val = "";
left = right = father = NULL;
}
};
node* a[21];
node* findroot(node* n){
while(n -> father != NULL){
n = n -> father;
}
return n;
}
string dfs(node* root){
string temp1 = "", temp2 = "", temp = "";
if(root -> left){
temp1 = "(" + dfs(root -> left) + ")";
}
if(root -> right){
temp2 = "(" + dfs(root -> right) + ")";
}
//开始写错了 以为是负号的特殊性 导致测试点4没过
//if(root -> val == '-'){
//分别考虑 有右孩子并有左孩子 和 只有右孩子
if(root -> left && root -> right){
temp = temp1 + temp2 + root -> val;
}else{
temp = root -> val + temp2;
}
return temp;
}
int main(){
int n;
cin >> n;
for(int i = 1; i <=n ;i++){
a[i] = new node();
}
for(int i = 1; i <= n; i++){
string va;
int le, ri;
cin >> va >> le >> ri;
a[i] -> val = va;
if(le != -1){
a[i] -> left = a[le];
a[le] -> father = a[i];
}
if(ri != -1){
a[i] -> right = a[ri];
a[ri] -> father = a[i];
}
}
node* root = findroot(a[1]);
string res = dfs(root);
cout << "(" + res + ")";
}
1163 Dijkstra Sequence(30)
// 错 思路太乱了 改不动了
// #include<iostream>
// #include<vector>
// using namespace std;
// const int maxn = 1e3 + 1;
// const int INF = 1e7;
// int adj[maxn][maxn];
// int dis[maxn];
// int nv, ne, k;
// int main(){
// cin >> nv >> ne;
// int v1, v2, weight;
// for(int i = 1; i <= nv; i++){
// for(int j = 1; j <= nv; j++){
// adj[i][j] = INF;
// }
// }
// for(int i = 1; i <= ne; i++){
// cin >> v1 >> v2 >> weight;
// adj[v1][v2] = adj[v2][v1] = weight;
// }
// cin >> k;
// vector<int> seq;
// for(int i = 1; i <= k; i++){
// seq.clear();
// for(int j = 1; j <= nv; j++){
// cin >> v1;
// seq.push_back(v1);
// }
// bool visit[nv + 1] = {false};
// for(int i = 1; i <= nv; i++){
// dis[i] = INF;
// }
// int index = 0;
// int all_flag = 0;
// for(int j = 1; j <= nv; j++){
// visit[seq[index]] = true;
// int now = seq[index];
// vector<int> next;
// int minn = INF;
// for(int t = 1; t <= nv; t++){
// if(dis[t] > adj[now][t]){
// dis[t] = adj[now][t];
// }
// if(minn > dis[t] && visit[t] == false){
// minn = dis[t];
// next.clear();
// next.push_back(t);
// }else if(minn == dis[t] && visit[t] == false){
// next.push_back(t);
// }
// }
// if(next.empty()){
// if(index == nv - 1){
// break;
// }else{
// all_flag = 1;
// break;
// }
// }else{
// int flag = 0;
// index++;
// for(int t = 0; t < next.size(); t++){
// if(next[t] == seq[index]){
// flag = 1;
// break;
// }
// }
// if(flag == 0){
// all_flag = 1;
// break;
// }
// }
// }
// if(all_flag == 1){
// cout << "No\n";
// }else{
// cout << "Yes\n";
// }
// }
// }
#include<iostream>
#include<vector>
using namespace std;
const int maxn = 1001;
const int INF = 1e9;
int adj[maxn][maxn], dis[maxn];
bool visit[maxn];
int nv, ne ,k, flag;
int start, endd;
void deal(int x, int index, vector<int> seq){
for(int i = 1; i <= nv; i++){
int minn = INF, now = seq[index];
for(int j = 1; j <= nv; j++){
if(dis[j] != INF && !visit[j] && dis[j] <= minn){
if(dis[j] < minn){
if(j == now){
flag = 1;
}else{
flag =0;
}
}else if(dis[j] == minn){
if(j == now){
flag = 1;
}
}
minn = dis[j];
}
}
if(!flag){
return;
}
index++;
if(index > nv){
return;
}
visit[now] = true;
for(int j = 1; j <= nv; j++){
if(!visit[j] && dis[j] > dis[now] + adj[now][j] && adj[now][j] != 0){
dis[j] = dis[now] + adj[now][j];
}
}
}
}
int main(){
cin >> nv >> ne;
int v1, v2, we;
for(int i = 0; i < ne; i++){
cin >> v1 >> v2 >> we;
adj[v1][v2] = adj[v2][v1] = we;
}
cin >> k;
for(int i = 0 ;i < k; i++){
vector<int> seq(nv);
fill(visit, visit + maxn, false);
fill(dis, dis + maxn, INF);
for(int j = 0; j < nv; j++){
cin >> seq[j];
}
start = seq[0], endd = seq[nv - 1];
dis[start] = 0;
deal(start, 0, seq);
if(flag){
cout << "Yes\n";
}else{
cout << "No\n";
}
}
return 0;
}
1164 Good in C(20)
#include<iostream>
using namespace std;
string s[27][8];
string sentence;
int main(){
for(int i = 1; i <= 26; i++){
for(int j = 1; j <= 7; j++){
cin >> s[i][j];
}
}
cin.get();//吸收换行符
getline(cin, sentence);
//cin >> sentence; 可能存在空格分隔的情况
int flag = 0;
string temp = "";
for(int i = 0; i < sentence.length(); i++){
if(sentence[i] >= 'A' && sentence[i] <= 'Z'){
temp += sentence[i];
}else{
//可能输入的第一个是无效字符
if(temp == ""){
continue;
}
if(flag != 0){
cout << endl;
}
for(int j = 1; j <= 7; j++){
for(int k = 0; k < temp.length(); k++){
if(k != 0){
cout << " ";
}
int t = temp[k] - 64;
cout << s[t][j];
}
cout << endl;
}
temp = "";
flag = 1;
}
}
if(sentence[sentence.length() - 1] >= 'A' && sentence[sentence.length() -1] <= 'Z'){
if(flag != 0){
cout << endl;
}
for(int j = 1; j <= 7; j++){
for(int k = 0; k < temp.length(); k++){
if(k != 0){
cout << " ";
}
int t = temp[k] - 64;
cout << s[t][j];
}
cout << endl;
}
}
}
1165 Block Reversing(25)
#include<iostream>
#include<stack>
using namespace std;
const int maxn = 1e5 + 1;
struct node{
int start, val, next;
}nums[maxn];
stack<node> s;
int main(){
int first, n, k;
cin >> first >> n >> k;
for(int i = 0; i < n; i++){
int st, va, ne;
cin >> st >> va >> ne;
nums[st].start = st;
nums[st].val = va;
nums[st].next = ne;
}
int cnt = 0;
stack<node> temp;
while(first != -1){
temp.push(nums[first]);
first = nums[first].next;
cnt++;
if(cnt == k){
while(!temp.empty()){
node tempn = temp.top();
s.push(tempn);
temp.pop();
}
cnt = 0;
}
}
if(cnt != 0){
while(!temp.empty()){
node tempn = temp.top();
s.push(tempn);
temp.pop();
}
}
while(!s.empty()){
int st, ne;
node tempn = s.top();
st = tempn.start;
s.pop();
if(s.empty()){
ne = -1;
printf("%05d %d %d\n", st, tempn.val, ne);
}else{
ne = s.top().start;
printf("%05d %d %05d\n", st, tempn.val, ne);
}
}
return 0;
}
1166 Summit(25)
#include<iostream>
#include<vector>
using namespace std;
const int maxn = 201;
int adj[maxn][maxn] = {0};
int main(){
int n, m, k;
cin >> n >> m;
int u1, u2;
for(int i = 1; i <= m; i++){
cin >> u1 >> u2;
adj[u1][u2] = adj[u2][u1] = 1;
}
cin >> k;
int l;
for(int i = 1; i <= k; i++){
cin >> l;
vector<int> v;
int temp;
for(int j = 0; j < l; j++){
cin >> temp;
v.push_back(temp);
}
int flag = 0;
for(int j = 0; j < l; j++){
for(int k = j + 1; k < l; k++){
if(adj[v[j]][v[k]] == 0){
flag = 1;
break;
}
}
if(flag == 1){
break;
}
}
if(flag == 1){
printf("Area %d needs help.\n", i);
continue;
}
int ans = -1;
for(int j = 1; j <= n; j++){
flag = 0;
for(int k = 0; k < l; k++){
if(adj[j][v[k]] == 0){
flag = 1;
}
}
if(flag == 1){
continue;
}else{
ans = j;
break;
}
}
if(ans == -1){
printf("Area %d is OK.\n", i);
}else{
printf("Area %d may invite more people, such as %d.\n", i, ans);
}
}
}
1167 Cartesian Tree(30)
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
const int INF = 1e8 + 1;
vector<int> v;
int n;
struct trnode{
int val;
trnode *left, *right;
trnode(int _val){
val = _val;
left = right = NULL;
}
};
void dfs(int left, int right, trnode* &node){
if(left > right || right < 0 || left > n - 1){
return;
}
int minn = INF, minn_index = -1;
for(int i = left; i <= right; i++){
if(v[i] < minn){
minn = v[i];
minn_index = i;
}
}
trnode *temp = new trnode(minn);
node = temp;
dfs(left, minn_index - 1, node -> left);
dfs(minn_index + 1, right, node -> right);
}
int main(){
cin >> n;
v.resize(n);
for(int i = 0; i < n; i++){
cin >> v[i];
}
trnode *root;
dfs(0, n - 1, root);
queue<trnode*> q;
q.push(root);
int flag = 0;
while(!q.empty()){
trnode* temp = q.front();
if(flag == 0){
cout << temp -> val;
flag = 1;
}else{
cout << " " << temp -> val;
}
if(temp -> left){
q.push(temp ->left);
}
if(temp -> right){
q.push(temp -> right);
}
q.pop();
}
return 0;
}