PAT 1021-1030

1021

#include<iostream>
#include<queue>
using namespace std;
struct node {
    int id;
    node* left = nullptr;
    node* right = nullptr;
};

int a[31];
int b[31];
int N;
node* build_tree(int h1, int t1, int h2, int t2) {
    if (h1 > t1) return NULL;
    node* p = new node;
    p->id = a[t1];
    int index;
    for (index = h2; b[index] != a[t1]; index++);
    p->left = build_tree(h1, index - 1 - h2 + h1, h2, index - 1);
    p->right = build_tree(index - h2 + h1, t1 - 1, index + 1, t2);
    return p;
}
int main() {
    cin >> N;
    for (int i = 0; i < N; i++) {
        cin >> a[i];
    }
    for (int i = 0; i < N; i++) {
        cin >> b[i];
    }
    node*root = build_tree(0, N-1, 0, N-1);
    queue<node*> tree;
    tree.push(root);
    int i = 0;
    while (!tree.empty()) {
        if (i != 0)cout << ' ';
        node* temp = tree.front();
        tree.pop();
        cout <<temp ->id;
        if (temp->left != nullptr)tree.push(temp->left);
        if (temp->right != nullptr)tree.push(temp->right);
        i++;
    }
}

1022

/*
3
1111111//书的id
The Testing Book//书的标题
Yue Chen//作者
test code debug sort keywords//书的关键字
ZUCS Print//出版商
2011//出版年份
*/
#include<iostream>
#include<string>
#include<map>
#include<set>
using namespace std;
map<string, set<string>> m[6];//将书的标题和id绑定

void input_set(set<string> s)
{
    for (auto it = s.begin(); it != s.end(); it++)
    {
        cout << *it << endl;
    }
}

int main() {
    int N;
    cin >> N;
    getchar();
    for (int i = 0; i < N; i++) {
        string id, title, author, key_word, publisher, year;
        getline(cin, id);
        getline(cin, title);
        m[1][title].insert(id);
        getline(cin, author);
        m[2][author].insert(id);
        do {
            cin >> key_word;
            m[3][key_word].insert(id);
        } while (getchar() == ' ');
        getline(cin, publisher);
        m[4][publisher].insert(id);
        getline(cin, year);
        m[5][year].insert(id);
    }
    int Q;
    cin >> Q;
    getchar();
    while (Q--) {
        string s0,s;

        getline(cin, s0);
        for (int i = 3; i < s0.size(); i++) {
           s += s0[i];   
        }
        bool flag = false;
        if (s0[0] == '1')
        {
            if (m[1][s].size())
                flag = 1;
            cout << s0<<endl;
            for (auto it = m[1][s].begin(); it != m[1][s].end(); it++)
            {
                cout << *it << endl;
            }
        }
        if (s0[0] == '2')
        {
            if (m[2][s].size())
                flag = 1; 
            cout << s0<<endl;
            for (auto it = m[2][s].begin(); it != m[2][s].end(); it++)
            {
                cout << *it << endl;
            }
        }
        if (s0[0] == '3')
        {
            if(m[3][s].size())
               flag = 1; 
            cout << s0<<endl;
            for (auto it = m[3][s].begin(); it != m[3][s].end(); it++)
            {
                cout << *it << endl;
            }
        }
        if (s0[0] == '4')
        {
            if (m[4][s].size())
                flag = 1;
            cout << s0<<endl;
            for (auto it = m[4][s].begin(); it != m[4][s].end(); it++)
            {
                cout << *it << endl;
            }
        }
        if (s0[0] == '5')
        {
            if (m[5][s].size())
                flag = 1;
            cout << s0<<endl;
            for (auto it = m[5][s].begin(); it != m[5][s].end(); it++)
            {
                cout << *it << endl;
            }
        }
        if (!flag) {
            cout << "Not Found"<<endl;
        }
    }
}

1023

#include<iostream>
#include<string>
#include<map>
using namespace std;

string N;
int P[10] = { 0 };
int Q[10] = { 0 };
string Re_double_s(string s)
{
    int ci = 0;//进位
    string res = "";
    for (int i = s.size() - 1; i >= 0; i--)
    {
        int a = ((s[i] - '0') * 2) + ci;
        int b = a % 10;
        ci = a / 10;
        b = b + '0';
        res += b;
    }
    if (ci !=0)res += ci+'0';
    return res;//最终得到double_s的反转序列
}
int main() {
    cin >> N;
    for (int i = 0; i < N.size(); i++)
    {
        P[N[i]-'0'] += 1;
    }
    string res = Re_double_s(N);
    for (int i = 0; i < res.size(); i++)
    {
        Q[res[i]-'0'] += 1;
    }
    bool flag = 1;//两个序列是否为重新排列
    if (N.size() == res.size())
    {
        for (int i = 0; i < 10; i++)
        {
            if (P[i] != Q[i])
                flag = 0;
        }

    }
    else {
        flag = 0;//两个序列不是重新排列
    }
    if (flag)//是重新排列
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
    for (int i = res.size() - 1; i >= 0; i--)
    {
        cout << res[i];
    }
}

1024

#include<iostream>
#include<string>
using namespace std;
int step = 0;
string Re_s(string s)
{
    string res = "";
    for (int i = s.size() - 1; i >= 0; i--)
    {
        res += s[i];
    }
    return res;
}
string s1_add_s2(string s1, string s2)
{
    string res = s1;
    int ci = 0;
    for (int i = s1.size() - 1; i >= 0; i--)
    {
        int a = ((s1[i] - '0') + (s2[i] - '0') + ci);
        int b = a % 10;
        ci = a / 10;
        res[i] = b + '0';
    }
    if (ci != 0)
    {
        res += ci + '0';
        for (int i = s1.size(); i >= 1; i--) {
            res[i] = res[i - 1];
        }
        res[0] = ci + '0';
    }
    return res;
}
bool is_palin(string s)
{
    bool flag = 1;
    int mid = s.size() / 2;
    for (int i = 0; i < mid; i++) {
        if (s[i] != s[s.size() - i - 1])
        {
            flag = 0; break;
        }
    }
    return flag;
}
string trans_palindromic(string N, int K)
{
    string s1 = N;
    if(is_palin(s1))
        return s1;
    while (K--)
    {
        string s2 = Re_s(s1);
        s1 = s1_add_s2(s1, s2);
        step++;
        if (is_palin(s1))
        {
            break;
        }

    }
    return s1;
}
int main()
{
    string N;
    int K;
    cin >> N >> K;
    string res = trans_palindromic(N, K);
    cout << res << endl;
    cout << step << endl;

}

1025

#include<iostream>
#include<string>
#include<vector>
#include<map>
#include<algorithm>
using namespace std;

struct student {
    string id;
    int place;
    int score;
    int rank;
    int z_rank;
};
vector<student> stud[100];//100个场地的学生信息
map<int, vector<student>> MAP;
//排名,该排名的学生数组

bool cmp(student x, student y) { return x.score > y.score; }
bool cmp0(student x, student y) { return x.id < y.id; }
int main()
{
    int N;
    cin >> N;
    for (int i = 0; i < N; i++)
    {
        int num;
        cin >> num;
        for (int j = 0; j < num; j++)
        {
            student temp;
            cin >> temp.id >> temp.score;
            temp.place = i+1;
            stud[i].push_back(temp);
        }
    }
    //分别在每一个场地进行排名
    for (int i = 0; i < N; i++)
    {
        sort(stud[i].begin(), stud[i].end(), cmp);
        stud[i][0].rank = 1;
        for (int j = 1; j < stud[i].size(); j++)
        {
            if (stud[i][j].score == stud[i][j - 1].score)
                stud[i][j].rank = stud[i][j - 1].rank;
            else
                stud[i][j].rank = j + 1;
        }
    }
    //合并所有的学生到一个vector中,进行一个总的排名
    vector<student> Z;
    for (int i = 0; i < N; i++)
    {
        for (int j = 0; j < stud[i].size(); j++)
        {
            Z.push_back(stud[i][j]);
        }
    }
    sort(Z.begin(), Z.end(),cmp);
    Z[0].z_rank = 1;
    MAP[1].push_back(Z[0]);
    for (int i = 1; i < Z.size(); i++)
    {
        if (Z[i].score == Z[i - 1].score)
        {
            Z[i].z_rank = Z[i - 1].z_rank;
            MAP[Z[i].z_rank].push_back(Z[i]);
        }
        else
        {
            Z[i].z_rank = i + 1;
            MAP[Z[i].z_rank].push_back(Z[i]);
        }
    }
    cout << Z.size() << endl;
    for (auto it = MAP.begin(); it != MAP.end(); it++)
    {
        //it->second;
        sort(it->second.begin(), it->second.end(), cmp0);
        for (int i = 0; i < it->second.size(); i++)
        {
            cout << it->second[i].id << ' ' << it->second[i].z_rank << ' ' <<
                it->second[i].place << ' ' << it->second[i].rank << endl;
        }
    }
//注意:看了弄夫的视频以后才发现,除了map可以实现同排名下按id排序之外,更简单
//的方法应该是重写cmp0函数,为
/*  bool cmp0(student x,student y){
        if(x.score!=y.score)return x.score>y.score;
        else return x.id<y.id;
    }
*/
}

1026

#include<iostream>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;

struct player {
    int come_time;
    int go_time;
    int serve_time = 0;//服务时间,若服务时间不为0,则表示已经被服务过
    int tag = 0;
    int process;
};

struct table {
    int is_vip = 0;
    int count = 0;
    int serve = -1;
};
player p[10000];
table t[101];
bool cmp(player x, player y)
{
    return x.come_time < y.come_time;
}
vector<int> serve_queue;

void printss(int come_time, int s_time)
{
    int come_hh = come_time / 3600;
    int come_mm = (come_time / 60) % 60;
    int come_ss = come_time % 60;

    int s_hh = s_time / 3600;
    int s_mm = (s_time / 60) % 60;
    int s_ss = s_time % 60;

    printf("%02d:%02d:%02d %02d:%02d:%02d %d\n",
        come_hh, come_mm, come_ss, s_hh, s_mm, s_ss
        , (s_time - come_time+30) / 60);
}
int main()
{
    int N;
    cin >> N;
    for (int i = 0; i < N; i++)
    {
        int hh, mm, ss, process, tag;
        char c;
        cin >> hh >> c >> mm >> c >> ss >> process >> tag;
        //if(process>7200)process=7200;
        p[i].come_time = hh * 3600 + mm * 60 + ss;
        p[i].process = process * 60;
        if(p[i].process>7200)p[i].process=7200;
        p[i].tag = tag;
    }

    int K, M;
    cin >> K >> M;
    int a;
    while (M--) {
        cin >> a;
        t[a].is_vip = 1;
    }
    sort(p, p + N, cmp);
    int nid = 0;
    queue<int>q1, q2;

    for (int time = 28800; time < 75600; time++)
    {
        //送客
        for (int i = 1; i <= K; i++)
        {
            if (t[i].serve >= 0)//该桌子有人使用
            {
                if (p[t[i].serve].go_time == time)
                {
                    t[i].serve = -1;
                }
            }
        }
        //入队
        while (nid < N && p[nid].come_time == time)
        {
            q1.push(nid);
            if (p[nid].tag)q2.push(nid);
            nid++;
        }
        //接客

        //1,有vip客户同时有vip桌子时
        while (q2.size() && p[q2.front()].serve_time != 0)q2.pop();
        for (int i = 1; i <= K; i++)
        {
            if (!t[i].is_vip)continue;
            if (t[i].serve < 0) {
                if (q2.size()) {
                    int j = q2.front();
                    serve_queue.push_back(j);
                    p[j].serve_time = time;
                    p[j].go_time = time + p[j].process;
                    t[i].serve = j;
                    t[i].count++;
                    while (q2.size() && p[q2.front()].serve_time != 0)q2.pop();
                }
            }
        }
        //2,没有vip桌子空闲,用普通桌子接待用户

        while (q1.size() && p[q1.front()].serve_time != 0)q1.pop();
        for (int i = 1; i <=K; i++)
        {
            if (t[i].serve < 0) {
                if (q1.size()) {
                    int j = q1.front();
                    serve_queue.push_back(j);
                    p[j].serve_time = time;
                    p[j].go_time = time + p[j].process;
                    t[i].serve = j;
                    t[i].count++;
                    while (q1.size() && p[q1.front()].serve_time != 0)q1.pop();
                }
            }
        }

    }

    for (int i = 0; i < serve_queue.size(); i++)
    {
        printss(p[serve_queue[i]].come_time, p[serve_queue[i]].serve_time);

    }
    for (int i = 1; i <= K; i++)
    {
        cout << t[i].count;
        if (i != K)cout << ' ';
    }
    cout<<endl;
}

1027

#include<iostream>
#include<string>
using namespace std;

string decimal_to13(int N)
{
    char l,r;
    int a=N%13;
    N=N/13;
    int b=N%13;
    if(a>9){a=a-10;r=a+'A';}
    else{r=a+'0';}
    if(b>9){b=b-10;l=b+'A';}
    else{l=b+'0';}
    string ans;
    ans+=l;
    ans+=r;
    return ans;
}
int main()
{
    int R,G,B;
    cin>>R>>G>>B;
    string res;
    res+=decimal_to13(R);
    res+=decimal_to13(G);
    res+=decimal_to13(B);
    cout<<'#'<<res<<endl;
}


1028

#include<iostream>
#include<string>
#include<algorithm>
#include<cstdio>
using namespace std;

struct student {
    int id;
    string name;
    int grade;
};
int N, C;
student s[100000];
bool cmp1(student x, student y)
{
    return x.id < y.id;
}
bool cmp2(student x, student y)
{
    if (x.name != y.name)return x.name < y.name;
    else return x.id < y.id;
}
bool cmp3(student x, student y)
{
    if (x.grade != y.grade)return x.grade < y.grade;
    else return x.id < y.id;
}
void printC()
{
    if (C == 1)sort(s, s + N, cmp1);
    if (C == 2)sort(s, s + N, cmp2);
    if (C == 3)sort(s, s + N, cmp3);
    for (int i = 0; i < N; i++)
    {
        printf("%06d",s[i].id);
        cout<< ' ' << s[i].name << ' ' << s[i].grade << endl;
    }
}
int main()
{

    cin >> N >> C;
    for (int i = 0; i < N; i++)
    {
        cin >> s[i].id >> s[i].name >> s[i].grade;
    }
    printC();
}

1029

#include<iostream>
#include<algorithm>
using namespace std;
int n,m;
int a[200000],b[200000],c[400000];

int main()
{
	cin>>n;
	for(int i=0;i<n;i++)
		cin>>a[i];
	cin>>m;
	for(int i=0;i<m;i++)
		cin>>b[i];
	int i=0,j=0,k=0;
	while(i<n&&j<m)
	{
		if(a[i]<b[j]) 
		    c[k++]=a[i++];
		else c[k++]=b[j++];
	}
	while(i<n) {c[k]=a[i];k++;i++;}
	while(j<m) {c[k]=b[j];k++;j++;}
	printf("%d",c[(n+m-1)/2]);//奇偶数都一样
	return 0;
}

1030

#include<iostream>
#include<vector>
using namespace std;
struct road {
    int eid;//路的另一端的城市
    int dis;//路的另一端的距离
    int cost;//路的另一端的花费
};
vector<road> m[500];//存储最多500个城市的道路

int min_dis[500];
vector<int> path;
vector<int> final_path;
int min_cost[500];

int N, M, S, D;
void dfs(int id, int length, int cost)
{
    if (min_dis[id] < length)return;
    path.push_back(id);
    if (id == D)
    {
        if (min_dis[id] > length || (min_dis[id] == length && min_cost[id] > cost))
        {
            final_path = path;
            min_dis[id] = length;
            min_cost[id] = cost;
        }
    }
    else {
        if (min_dis[id] > length || (min_dis[id] == length && min_cost[id] > cost))
        {
            min_dis[id] = length;
            min_cost[id] = cost;
        }
        for (int i = 0; i < m[id].size(); i++)
        {
            dfs(m[id][i].eid, length + m[id][i].dis, cost + m[id][i].cost);
        }
    }
    path.pop_back();
}
int main()
{
    cin >> N >> M >> S >> D;
    for (int i = 0; i < M; i++)
    {
        int id;
        road temp1, temp2;
        cin >> id >> temp1.eid >> temp1.dis >> temp1.cost;
        temp2.eid = id; temp2.dis = temp1.dis;
        temp2.cost = temp1.cost;
        m[id].push_back(temp1);
        m[temp1.eid].push_back(temp2);
    }
    for (int i = 0; i < N; i++) { min_dis[i] = 999999; min_cost[i] = 99999; }

    dfs(S, 0, 0);
    for (int i = 0; i < final_path.size(); i++)
    {
        cout << final_path[i] << ' ';
    }
    cout << min_dis[D] << ' ' << min_cost[D];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值