PAT甲级 20分题

1.PAT1005 20分

测试样例3结果为零;不要忘记考虑零的结果

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

string change[] = {"zero","one","two","three","four","five","six","seven","eight","nine"};



int main()
{
    string s;
    long long n = 0;
    vector<int> ans;
    cin >> s;
    int len = s.size();
    for(int i = 0; i < len; i++){
        n += (s[i]-'0');
    }
    if(n==0){//一定要考虑0!!!
        cout << "zero";
        return 0;
    }
    while(n){
        ans.push_back(n%10);
        n/=10;
    }
    for(int i = ans.size()-1; i >= 0; i--){
        cout << change[ans[i]];
        if(i) printf(" ");
    }
    return 0;
}

2.PAT-1008 Elevator

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


int main()
{
    int n,a,tmp=0,sum=0;
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> a;
        if(tmp-a<0){//上升
            sum += (a-tmp)*6+5;
        }
        else {
            sum += (tmp-a)*4+5;
        }
        tmp = a;
    }
    cout << sum;
    return 0;
}

3.PAT1011

这里值得注意的是:用double型表示数据,然后输出用llf出错;改成float,输出用f好了

或者用C++输出方案:

    cout << setiosflags(ios::fixed) << setprecision(2) << (maxn*0.65-1)*2;
#include <iostream>
#include <bits/stdc++.h>
using namespace std;


int main()
{
    float a,b,c;
    float maxn = 1;
    char ch[3];
    for(int i = 0; i < 3; i++){
        cin >>a>>b>>c;
        if(a>b&&a>c){
            maxn *= a;
            ch[i] = 'W';
        }
        else if(b>a&&b>c){
            maxn *= b;
            ch[i] = 'T';
        }
        else if(c>a&&c>b){
            maxn *= c;
            ch[i] = 'L';
        }
    }
    for(int i = 0; i < 3; i++){
        cout << ch[i] << " ";
    }
    printf("%.2f",(maxn*0.65-1)*2);
    return 0;
}

4.PAT1019可翻转素数

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

vector<int> ans;

void fun(int n,int b)
{
    ans.clear();
    while(n){
        ans.push_back(n%b);
        n /= b;
    }
}

bool judge()
{
    int len = ans.size();
    for(int i = 0; i < len/2; i++){
        if(ans[i]!=ans[len-i-1]){
            return false;
        }
    }
    return true;
}


int main()
{
    int n,b;
    cin >>n>>b;
    //n>0 因此无需特判0
    fun(n,b);
    if(judge()) printf("Yes\n");
    else printf("No\n");
    for(int i = ans.size()-1; i >= 0; i--){
        cout << ans[i];
        if(i) printf(" ");
    }
    return 0;
}

5.PAT1023

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

int a[25];
int b[25];

bool vis_b[25];

bool judge(int len)
{
    for(int i = 0; i < len; i++){
        bool flag = false;//第一次flag逻辑写错
        for(int j = 0; j < len; j++){
            if(b[j]==a[i]&&!vis_b[j]){
                vis_b[j] = true;
                flag = true;
                break;
            }
        }
        if(!flag) return false;
    }
    return true;
}


int main()
{
    string s;
    cin >> s;
    for(int i = 0; i < s.size(); i++){
        a[i] = s[i]-'0';
    }
    int len = s.size();
    int c = 0;
    for(int i = len-1; i >= 0; i--){
        int tmp = a[i]*2+c;
        b[len-i-1] = tmp%10;
        c = tmp/10;
    }
    if(c>0){
        printf("No\n");
        len++;
        b[len-1] = c;
    }
    else {
        memset(vis_b,false,sizeof(vis_b));
        if(judge(len)) printf("Yes\n");
        else printf("No\n");
    }
    for(int i = len-1; i >= 0; i--){
        printf("%d",b[i]);
    }
    return 0;
}

6.PAT1027

注意考虑0;考虑只有一位数字时怎么输出:<=9输出"0%d"或“0%c”,要考虑是数字还是字母输出,一定要考虑全面。

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

vector<int> a;

void fun(int n)
{
    a.clear();
    if(n==0){
        printf("00");
        return;
    }
    while(n){
        a.push_back(n%13);
        n /= 13;
    }
    if(a.size()==1){
        printf("0");
        if(a[0]>9) printf("%c",'A'+(a[0]-9)-1);
        else printf("%d",a[0]);
    }
    else {
        for(int i = 1; i>=0; i--){
            if(a[i]>9) printf("%c",'A'+(a[i]-9)-1);
            else printf("%d",a[i]);
        }
    }
}


int main()
{
    int r,g,b;
    cin >>r>>g>>b;
    cout << "#";
    fun(r);
    fun(g);
    fun(b);
    return 0;
}

7.PAT1035

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

struct password
{
    string id,pwd;
    bool flag;
    password(){}
    password(string id,string pwd,bool flag):id(id),pwd(pwd),flag(flag){}
};

vector<password> v;

bool _replace(password &p)
{
   // string s = p.pwd;//这样写无法改变pwd值
    int cnt = 0;
    for(int i = 0; i < p.pwd.size(); i++){
        if(p.pwd[i]=='1') p.pwd[i] = '@';
        else if(p.pwd[i]=='0') p.pwd[i] = '%';
        else if(p.pwd[i]=='l') p.pwd[i] = 'L';
        else if(p.pwd[i]=='O') p.pwd[i] = 'o';
        else cnt++;
    }
    if(cnt==p.pwd.size()) return false;
    p.flag = true;
    return true;
}

int main()
{
    int n,cnt=0;
    string id,pwd;
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >>id>>pwd;
        password p = password(id,pwd,false);
        if(_replace(p)) cnt++;
        v.push_back(p);//push操作要在replace以后
    }
    if(cnt>0){
        cout << cnt << endl;
        for(int i = 0; i < v.size(); i++){
            if(v[i].flag){
                cout << v[i].id << " " << v[i].pwd << endl;
            }
        }
    }
    else {
        if(n==1){
            printf("There is 1 account and no account is modified");
        }
        else {
            printf("There are %d accounts and no account is modified",n);
        }
    }
    return 0;
}

8.PAT1041

思路很简单一道题,差点写得复杂;

所以说做题一定先明确思路,是不是最简单的或你在有限时间内能够想出的最简单的方法,否则过分复杂的思路是浪费时间。

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

const int N = 1e5+5;
int a[N];
int visTimes[N];

int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> a[i];
        visTimes[a[i]]++;
    }
    bool FIND = false;
    for(int i = 0; i < n; i++){
        if(visTimes[a[i]]==1){
            printf("%d",a[i]);
            FIND = true;
            break;
        }
    }
    if(!FIND) printf("None");
    return 0;
}

9.1046Shortest Distance

第一次提交:最后一个样例超时

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

const int N = 1e5+5;
int d[N];

int calculate(int a,int b)
{
    int ans=0;
    int minn = min(a,b),maxn = max(a,b);
    for(int i = minn; i <= maxn-1; i++){
        ans += d[i];
    }
    return ans;
}

int main()
{
    int n,m,a,b,sum = 0;
    cin >> n;
    for(int i = 1; i <= n; i++){
        cin >> d[i];
        sum += d[i];
    }
    cin >> m;
    for(int i = 0; i < m; i++){
        cin >>a>>b;
        int ans = calculate(a,b);
        cout << min(ans,sum-ans) << endl;
    }
    return 0;
}

修改后:

增加了一个类似前缀和的dis数组,dis[i]表示1~i之间的距离,则表示a~b之间距离可用dis[b-1]~dis[a-1]来计算;此题时间限制为200ms,用此法最后一个样例为77ms

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

const int N = 1e5+5;
int d[N];
int dis[N];

int main()
{
    int n,m,a,b,sum = 0;
    cin >> n;
    dis[0] = 0;
    for(int i = 1; i <= n; i++){
        cin >> d[i];
        dis[i] = dis[i-1]+d[i];
        sum += d[i];
    }
    cin >> m;
    for(int i = 0; i < m; i++){
        cin >>a>>b;
        int tmp;
        if(a<b) tmp = dis[b-1] - dis[a-1];
        else tmp = dis[a-1] - dis[b-1];
        cout << min(tmp,sum-tmp) << endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_36313227/article/details/88912190