PAT甲级刷题记录(1041-1050)

1041-1050

1041 Be Unique(20)

#include<cstdio>
#include<vector>
using namespace std;
const int maxn = 10001;
int nums[maxn] = {0};
vector<int> v;
int main(){
    int n, k;
    scanf("%d", &n);
    for(int i = 0; i < n ;i++){
        scanf("%d", &k);
        nums[k]++;
        v.push_back(k);
    }
    for(auto it = v.begin(); it != v.end(); it++){
        if(nums[(*it)] == 1){
            printf("%d", (*it));
            return 0;
        }
    }
    printf("Nones");
    return 0 ;
}

1042 Shuffling Machine(20)

#include<iostream>
using namespace std;

int order[55], value[55], new_value[55];
void change(int n){
    char t[5] = {'S', 'H', 'C', 'D', 'J'};
    n -= 1;
    cout << t[n / 13] << n % 13 + 1;
}
int main(){
    int n;
    scanf("%d", &n);
    for(int i = 1; i <= 54 ; i++){
        scanf("%d", &order[i]);
        value[i] = i;
    }
    for(int i = 1; i <= n; i++){
        for(int j = 1; j <= 54; j++){
            new_value[order[j]] = value[j];
        }
        for(int j = 1; j <= 54; j++){
            value[j] = new_value[j];
        }
    }
    for(int i = 1; i <= 54; i++){
        change(value[i]);
        if(i != 54){
            cout << " ";
        }
    }
}

1043 Is It a Binary Search Tree(25)

//BST的中序遍历是有序的 给定了前序遍历
//sort后得到中序遍历, 根据中序遍历和前序遍历重建二叉树
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
    int data;
    node *left, *right;
};
int n, d[1001];

void insert(node* &root, int x){
    if(root == NULL){
        root = new node;
        root -> left = NULL;
        root -> right = NULL;
        root -> data = x;
        return;
    }
    if(x < root -> data){
        insert(root -> left, x);
    }else{
        insert(root -> right, x);
    }
}

//进行先序遍历
int index_pre = 0, index_pre_mirror = 0;
int cnt1 = 0, cnt2 = 0;//控制空格输出
bool dfs(node* &root){
    if(root == NULL){
        return true;
    }
    if(root -> data != d[index_pre++]){
        return false;
    }
    return dfs(root -> left) && dfs(root -> right);
}
bool dfs_mirror(node* &root){
    if(root == NULL){
        return true;
    }
    if(root -> data != d[index_pre_mirror++]){
        return false;
    }
    return dfs_mirror(root -> right) && dfs_mirror(root -> left);
}
void coutpost(node* &root, bool mirror = false){
    if(mirror == false){
        if(root == NULL){
            return;
        }
        coutpost(root -> left);
        coutpost(root -> right);
        cnt1++;
        if(cnt1 != 1){
            cout << " ";
        }
        cout << root -> data;
    }else{
         if(root == NULL){
            return;
        }
        coutpost(root -> right, true);
        coutpost(root -> left, true);
        cnt2++;
        if(cnt2 != 1){
            cout << " ";
        }
        cout << root -> data;
    }

}

int main(){
    cin >> n;
    node *root = NULL;
    for(int i = 0; i < n; i++){
        cin >> d[i];
        insert(root, d[i]);
    }
    if(dfs(root)){
        cout << "YES" << endl;
        coutpost(root);
    }else if(dfs_mirror(root)){
        cout << "YES" << endl;
        coutpost(root, true);
    }else{
        cout << "NO" << endl;
    }
    
}

1044 Shopping in Mars(25)

//每个dp过去超时,后来用vector只dp部分数据,仍然超时
//二分来做
// #include<iostream>
// #include<vector>
// #include<algorithm>
// using namespace std;
// const int maxn = 100001;
// const int INF = 1e9;
// struct ans{
//     int left,right;
//     ans(int _left, int _right){
//         left = _left;
//         right = _right;
//     };
// };
// vector<ans> v;
// vector<int> temp, temp2;

// // int dp[maxn][maxn]; 内存超限
// int dp[maxn];
// int d[maxn];
// bool cmp(ans a1, ans a2){
//     return a1.left < a2.left;
// }
// int main(){
//     int n, m, minn = INF;
//     cin >> n >> m;
//     for(int i = 1; i <= n; i++){
//         cin >> d[i];
//         dp[i] = d[i];
//         temp.push_back(i);
//         if(d[i] < minn && d[i] >= m){
//             minn = d[i];
//             v.clear();
//             v.push_back(ans(i,i));
//         } else if(d[i] == m){
//             v.push_back(ans(i,i));
//         }
//     }
    
//     for(int len = 2; len <= n; len++){
// //         int flag = 0;
// // 超时
// //         for(int i = 1; i <= n - len + 1; i++){
// //             dp[i] = dp[i] + d[i + len - 1];
// //             if(dp[i] < minn && dp[i] >= m){
// //                 minn = dp[i];
// //                 v.clear();
// //                 v.push_back(ans(i, i + len -1));
// //             }else if(dp[i] == minn){
// //                 v.push_back(ans(i, i + len - 1));
// //             }
// //             if(dp[i] < minn){
// //                 flag = 1;
// //             }
// //         }
// //         if(flag == 0){
// //             break;
// //         }
//         if(temp.empty()){
//             break;
//         }
//         for(auto it = temp.begin(); it != temp.end(); it++){
//             int i = (*it);
//             dp[i] = dp[i] + d[i + len - 1];
//             if(dp[i] < minn && dp[i] >= m){
//                 minn = dp[i];
//                 v.clear();
//                 v.push_back(ans(i, i + len -1));
//             }else if(dp[i] == minn){
//                 v.push_back(ans(i, i + len - 1));
//             }
//             if(dp[i] < minn){
//                 temp2.push_back(i);
//             }
//         }
//         temp = temp2;
//         temp2.clear();
//     }
//     sort(v.begin(), v.end(), cmp);
//     for(auto it = v.begin(); it != v.end(); it++){
//         cout << (*it).left << "-" << (*it).right << endl;
//     }
//     return 0;
// }

#include<iostream>
#include<vector>
using namespace std;
const int INF = 1e9;
struct ans{
    int left,right;
    ans(int _left, int _right){
        left = _left;
        right = _right;
    };
};

vector<ans> v;
vector<int> sum;
int n, m;

void shopping(int i, int &j, int &tempsum){
    int left = i, right = n;
    while(left < right){
        int mid = (right - left) / 2 + left;
        if(sum[mid] - sum[i - 1] >= m){
            right = mid;
        }else{
            left = mid + 1;
        }
    }
    j = right;
    tempsum = sum[j] - sum[i - 1];
}

int main(){
    cin >> n >> m;
    sum.resize(n + 1);
    for(int i = 1; i <= n; i++){
        cin >> sum[i];
        sum[i] += sum[i - 1];
    }
    int minans = INF;
    for(int i = 1; i <= n; i++){
        int j, tempsum;
        shopping(i, j, tempsum);
        if(tempsum > minans){
            continue;
        }
        if(tempsum >= m){
            if(tempsum < minans){
                v.clear();
                minans = tempsum;
            }
            v.push_back(ans(i, j));
        }
    }
    for(auto it = v.begin(); it != v.end(); it++){
        cout << (*it).left << "-" << (*it).right << endl;
    }
}

1045 Favorite Color Stripe(30)

#include<iostream>
using namespace std;
const int maxn = 10001;
//dp[i][j]表示以 color[i]为最后一个匹配色对于前j个数的最大长度
int color[maxn], line[maxn], dp[maxn][maxn];
int main(){
    int n, m, l;
    cin >> n; 
    cin >> m;
    for(int i = 1; i <= m; i++){
        cin >> color[i];
    }
    cin >> l;
    for(int i = 1; i <= l; i++){
        cin >> line[i];
    }
    for(int i = 1; i <= m; i++){
        for(int j = 1; j <= l; j++){
            dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
            if(line[j] == color[i]){
                dp[i][j]++;
            }
        }
    }
    cout << dp[m][l];
}

1046 Shortest Distance(20)

循环链路上两点的最短路径

// 超时
// #include<cstdio>
// #include<cmath>
// using namespace std;
// const int maxn = 100001;
// int nums[maxn];
// int main(){
//     int n, m;
//     scanf("%d", &n);
//     for(int i = 1; i <= n ; i++){
//         scanf("%d", &nums[i]);
//     }
//     nums[0] = nums[n];
//     scanf("%d", &m);
//     for(int i = 1; i <= m ; i++){
//         int start, end;
//         scanf("%d%d", &start, &end);
//         if(start > end){
//             swap(start, end);
//         }
//         int ans1 = 0, ans2 = 0;
//         for(int j = start; j < end; j++){
//             ans1 += nums[j];
//         }
//         for(int j = end; j % n < start || j <= n; j++){
//             ans2 += nums[j % n];
//         }
//         printf("%d\n", min(ans1, ans2));
//     }
    
//     return 0;
// }
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn = 100001;
int nums[maxn];
int main(){
    int n, m;
    scanf("%d", &n);
    int sum = 0;
    for(int i = 1; i <= n ; i++){
        int temp;
        scanf("%d", &temp);
        sum += temp;
        nums[i] = sum;
    }
    scanf("%d", &m);
    for(int i = 1; i <= m ; i++){
        int start, end;
        scanf("%d%d", &start, &end);
        if(start > end){
            swap(start, end);
        }
        int ans = nums[end - 1] - nums[start - 1];
        printf("%d\n", min(ans, sum - ans));
    }
    
    return 0;
}

1047 Student List for Course(25)

//为了解决超时可以用c_str()将str转char* 
//或者直接不用str 直接用char数组存储name
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 2501;
vector<string> v[maxn];

bool cmp(string s1, string s2){
    return s1 < s2;
}
int main(){
    int n, m;
    cin >> n >> m;
    
    int len, temp;
    string name;
    for(int i = 1; i <= n; i++){
        cin >> name >> len;
        for(int j = 1; j <= len; j++){
            cin >> temp;
            v[temp].push_back(name);
        }
    }
    for(int i = 1; i <= m; i++){
        cout << i << " " << v[i].size() << endl;
        sort(v[i].begin(), v[i].end(), cmp);
// 超时
//         for(int j = 0; j < v[i].size(); j++){
//             cout << v[i][j] << endl;
//         }
        for(auto it = v[i].begin(); it != v[i].end(); it++){
            // string 转char* 输出更快 不超时
            printf("%s\n",it->c_str());
        }
    }
}

1048 Find Coins(25)

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
// 双指针
// vector<int> v;
// int main(){
//     int n, m;
//     cin >> n >> m;
//     v.resize(n);
//     for(int i = 0; i < n; i++){
//         cin >> v[i];
//     }
//     sort(v.begin(), v.end());
//     int i = 0, j = n - 1;
//     while(i < j){
//         if(v[i] + v[j] < m){
//             i++;
//         }else if(v[i] + v[j] > m){
//             j--;
//         }else{
//             cout << v[i] << " " << v[j] << endl;
//             return 0;
//         }
//     }
//     cout << "No Solution";
//     return 0;
// }

// 散列表
int a[1001];
int main(){
    int n, m, temp;
    cin >> n >> m;
    for(int i = 0; i < n; i++){
        cin >> temp;
        a[temp]++;
    }
    for(int i = 0; i < 1001; i++){
        if(a[i]){
            a[i]--;//防止重用
            if(m > i && a[m - i]){
                cout << i << " " << m - i;
                return 0;
            }
            a[i]++;
        }
    }
    cout << "No Solution";
    return 0;
}

1049 Counting Ones(30)

//数学题 编程之美 2.4节 1的数目
#include<iostream>
using namespace std;
int main(){
    int n;
    cin >> n;
    int left, right, now;
    int a = 1, ans = 0;
    while(n / a){
        left = n / (a * 10);
        now = n / a % 10;
        right = n % a;
        //cout << left <<" " << now << " " << right << endl;
        if(now == 0){
            ans += left *a;
        }else if(now == 1){
            ans += left * a + right + 1;
        }else{
            ans += left * a + a;
        }
        a *= 10;
    }
    cout << ans;
    return 0;
}

1050 String Subtraction(20)

#include<iostream>
using namespace std;
bool c[129];
int main(){
    string s1, s2;
    getline(cin, s1);
    getline(cin, s2);
    for(int i = 0; i < s2.length(); i++){
        c[(int)s2[i]] = true;
    }
    for(int i = 0; i < s1.length(); i++){
        if(c[(int)s1[i]] == false){
            cout << s1[i];
        } 
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值