PAT甲级官网 刷题(7)

PAT1056 Mice and Rice

  细心再细心,理解题意,模拟。

#include<iostream>
#include<vector>
#include<algorithm>

#define ac cin.tie(0);cin.sync_with_stdio(0);

using namespace std;
const int MAXN = 1010;
int arr[MAXN], ans[MAXN], cnt[MAXN];
int n, m;

int main() {
    
    
    ac
    cin >> n >> m;
    for (int i = 0; i < n; i++)
        cin >> arr[i];

    int t, rd = 1;
    vector<int> a;
    for (int i = 0; i < n; i++) {
    
    
        cin >> t;
        a.push_back(t);
    }
	//不止一个胜者就继续
    while (a.size() > 1) {
    
    
        vector<int> b;
        int pos = 0, tmp = 0;
        while (pos < a.size()) {
    
    
            if (pos % m == 0) {
    
    
                if (pos)
                //将胜者放入下一轮
                    b.push_back(a[tmp]);
                tmp = pos;
            } else {
    
    
                if (arr[a[pos]] > arr[a[tmp]]) {
    
    
                    ans[a[tmp]] = rd;
                    tmp = pos;
                } else
                    ans[a[pos]] = rd;
            }
            ++pos;
        }
        b.push_back(a[tmp]);
        //计算本轮淘汰的人
        cnt[rd] = a.size() - (a.size() / m + (a.size() % m != 0));
        ++rd;
        a.clear();
        for (int i:b)
            a.push_back(i);
    }
    cnt[rd] = 1;
    ans[a[0]] = rd;
    //累加人数,便于求名次
    for (int i = rd; i >= 1; i--)
        cnt[i] += cnt[i + 1];
    for (int i = 0; i < n; i++) {
    
    
        if (i)
            cout << " ";
        cout << cnt[ans[i] + 1] + 1;
    }
}

PAT1040 Longest Symmetric String

  最长回文子串,算法模板题。

#include<iostream>
#include<string>
#include<algorithm>

using namespace std;
const int MAXN = 1010;
bool dp[MAXN][MAXN];
string s;
int ans = 1;

int main() {
    
    
    int ri;

    getline(cin, s);

    for (int i = 0; i < s.length(); i++) {
    
    
        dp[i][i] = true;
        if (i) {
    
    
            if (s[i - 1] == s[i]) {
    
    
                dp[i - 1][i] = true;
                ans = 2;
            }
        }
    }
	//由短区间推长区间,长区间计算得依赖的短区间已经计算过了
    for (int len = 2; len < s.length(); len++) {
    
    
        for (int le = 0; le + len < s.length(); le++) {
    
    
            ri = le + len;
            dp[le][ri] = ((s[le] == s[ri]) && dp[le + 1][ri - 1]);
            if (dp[le][ri])
                ans = max(ans, ri - le + 1);
        }
    }
    cout << ans;
    return 0;
}

PAT1044 Shopping in Mars

  双指针裸题

#include<iostream>
#include<vector>
#define ac cin.tie(0);cin.sync_with_stdio(0);
using namespace std;
const int MAXN=100010;
int arr[MAXN];
int n,m;
typedef pair<int,int> PAIR;
vector<PAIR> ans;

int main(){
    
    
    ac     
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>arr[i];

    int cost=1e8+10,tmp=arr[1],le=1,ri=1;
    while(true){
    
    
        if(tmp<m){
    
    
        //移动右指针
            ++ri;
            if(ri>n)
                break;
            tmp+=arr[ri];
        }else{
    
    
            if(tmp-m<cost){
    
    
                cost=tmp-m;
                ans.clear();
                ans.push_back(PAIR(le,ri)); 
            }else if(tmp-m==cost){
    
    
                ans.push_back(PAIR(le,ri)); 
            }
            //移动左指针
            tmp-=arr[le];
            ++le;
        }
    }
    for(PAIR &i:ans)
        cout<<i.first<<"-"<<i.second<<endl;
    return 0;
}

PAT1153 Decode Registration Card of PAT

  本题最大收获:大量输入输出情况下不用cin,把scanf 改为 cin 就AC了,否则最后一个样例TLE ><

#include<iostream>
#include<string>
#include<vector>
#include<unordered_map>
#include<algorithm>
using namespace std;
const int MAXN=10010;
struct node{
    
    
    string name;
    int score;
    bool operator<(const node& a){
    
    
        if(score!=a.score)
            return score>a.score;
        else
            return name<a.name;
    }
}arr[MAXN];

int main(){
    
    
    int n,m,a;
    string s;

    cin>>n>>m;
    for(int i=0;i<n;i++){
    
    
        cin>>arr[i].name>>arr[i].score;
    }

    for(int i=1;i<=m;i++){
    
    
        cin>>a>>s;
        printf("Case %d: %d %s\n",i,a,s.c_str());
        if(a==1){
    
    
            vector<node> ans;
            for(int j=0;j<n;j++)
                if(arr[j].name[0]==s[0])
                    ans.push_back(arr[j]);
            if(ans.size()){
    
    
                sort(ans.begin(),ans.end());
                for(const node& i:ans)
                    printf("%s %d\n",i.name.c_str(),i.score);
            }else
                puts("NA");
        }else if(a==2){
    
    
            int cnt=0,ans=0;
            for(int j=0;j<n;j++)
                if(arr[j].name.substr(1,3)==s){
    
    
                    ++cnt;
                    ans+=arr[j].score;
                }
            if(cnt)
                printf("%d %d\n",cnt,ans);
            else
                puts("NA");
        }else{
    
    
            unordered_map<string,int> map;
            for(int j=0;j<n;j++)
                if(arr[j].name.substr(4,6)==s)
                    map[arr[j].name.substr(1,3)]++;
            if(!map.empty()){
    
    
                vector<pair<int, string>> tmp;
                for(auto i:map)
                    tmp.push_back({
    
    -i.second,i.first});
                sort(tmp.begin(),tmp.end());
                for(auto a:tmp)
                    printf("%s %d\n",a.second.c_str(),-a.first);
            }else
                puts("NA");
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Raymond_YP/article/details/110356625
今日推荐