PAT2020春季甲级模拟


第一题AC

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

string Date;

bool isPrime(int n) {
    
    
    int sq = sqrt(n);
    if(n <= 1) return false;
    for(int i = 2;i <= sq;++i)
        if(n % i == 0) 
            return false;
    return true;
}

int main() {
    
    
    cin >> Date;
    int flag = 1;
    for(int i = 0;i < Date.size();++i) {
    
    
        string subDate  = Date.substr(i);
        cout << subDate << " ";
        if(isPrime(stoi(subDate))) {
    
    
            cout << "Yes\n";
        } else {
    
    
            cout << "No\n";
            flag = 0;
        }
    }
    if(flag) cout << "All Prime!\n";

    return 0;
}

第二题 (测试点6错误)

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

int low, high, N, M;
vector<int> Number[11];
unordered_map<int, bool> visited; // 对应的数字是否出现过
bool isDifference[100010];
bool isOut[100010];


int main() {
    
    
    cin >> low >> high;
    if(low > high) swap(low, high);
    cin >> N >> M;
    for(int i = 1;i <= N;++i) {
    
    
        for(int j = 0;j < M;++j){
    
    
            int num;
            cin >> num;
            if(j == 0) Number[i].push_back(0);
            Number[i].push_back(num);
        }
    }
    isDifference[high - low] = true;
    visited[high] = visited[low] = true;
    for(int round = 1;round <= M;++round) {
    
    
        for(int player = 1;player <= N;++player){
    
    
            int nowNum = Number[player][round];
            if(isOut[player]) continue;

            for(auto p: visited) {
    
    
                int a = nowNum, b = p.first;
                int differ = abs(b - a);
                isDifference[differ] = true;
            } 

            if(visited[nowNum] || !isDifference[nowNum]){
    
    
                printf("Round #%d: %d is out.\n", round, player);
                isOut[player] = true;
            } else {
    
     // 似乎测试点6就是错在这里(考试时间结束后看了被人代码感觉这样能过测试点6)
            	// 如果因为当前的人出的数而淘汰就不将这个数算入了
                visited[nowNum] = true;
            }
            // 在考试时间内的时候是这么写的(似乎就这这里导致测试点6错误)
            //if(!visited[nowNum])
            //    visited[nowNum] = true;

              
        }
    }
    vector<int> win;
    for(int i = 1;i <= N;++i)
        if(!isOut[i])
            win.push_back(i);

    if(win.size() == 0)
        cout << "No winner.\n";
    else  {
    
    
        cout << "Winner(s):";
        for(int i = 0;i < win.size();++i)
            cout << " " <<win[i];
    }

    return 0;
}

第三题AC

在这里插入图片描述

#include<bits/stdc++.h>
using namespace std;

int N, R, K, M;
vector<int> G[501];
int regionAnimal[501] = {
    
    0};
map<int, bool> Cnt;
/*
K种动物,分成N个区域, R个邻接区域, M个方案
不能有两个相同种的动物在邻接区域
*/
int main() {
    
    
    cin >> N >> R >> K;
    for(int i = 0;i < R;++i) {
    
    
        int u, v;
        cin >> u >> v;
        G[u].push_back(v);
        G[v].push_back(u);
    }
    cin >> M;
    for(int i = 0;i < M;++i) {
    
    
        fill(regionAnimal+1, regionAnimal+N, -1);
        Cnt.clear();
        int flag = 1;
        for(int regionID = 1;regionID <= N;++regionID) {
    
    
            int animal;
            cin >> animal;
            Cnt[animal]++;
            regionAnimal[regionID] = animal;
            
        }
        for(int regionID = 1;regionID <= N;++regionID) {
    
    
            for(int v: G[regionID]){
    
    
                if(regionAnimal[v] > 0){
    
    
                    if(regionAnimal[v] == regionAnimal[regionID]){
    
    
                        if(i == 2) cout << regionID << "-" << v;
                        flag = 0;
                        break;
                    }
                }
            }
        }
        if(Cnt.size() != K) flag = 2;
        
        if(Cnt.size() < K) cout << "Error: Too few species.\n";
        else 
        if(Cnt.size() > K) cout << "Error: Too many species.\n";
        
        if(flag == 1) cout << "Yes\n";
        else
        if(flag == 0) cout << "No\n";
    }

    return 0;
}

第四题,不会,没时间写

猜你喜欢

转载自blog.csdn.net/MYMarcoreus/article/details/114675645