PAT A 1108 1109 1110 1111

这些题都需要仔细读题,很多错误都是因为题意不清导致的。

1108 字符串

题目大意:
real numbers:实数
accurate up to:精确到
2 decimal places:两位小数
给N个实数 ,计算符合条件的数的平均值。
符合条件的数是范围在[-1000,1000]并且精确到两位小数 的数字。
思路:
用sscanf, sprintf是个好方法,具体可以参考:柳婼 の blog
scanf("%s", a);
sscanf(a, "%lf", &temp);
sprintf(b, "%.2lf",temp);
但是这样做也没啥意思了,于是平时练习用复杂的方法做一遍。

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(){
    int n; // n<=100
    cin>>n;
    int count = 0;
    double sum = 0.0;
    for(int i=0;i<n;i++){
        string s;
        cin>>s;
        bool flag = true;
        bool exist = false;
        double num = 0.0;
        double k = 1;
        bool fuhao = true, ex_fu = false;
        for(int j=0;j<s.length();j++){
            if( (s[j]== '+' || s[j] == '-') && ex_fu == false){
                ex_fu = true;
                if(s[j]== '-'){
                    fuhao = false;
                }
            }else if( (s[j]== '+' || s[j] == '-') && ex_fu == true){
                flag = false;
                break;
            }else if(((!(s[j]>='0' && s[j]<='9')) && s[j]!='.') || (s[j] == '.' && exist == true)){
                flag = false;
                break;
            }else if(s[j] == '.' && exist == false && j != 0){
                exist = true;
            }else if(s[j] == '.' && exist == false && j == 0){// .2是不正确的 
                flag = false;
                break;
            }else{
                if(exist == false){
                    num = num*10 + s[j] - '0';
                }else{
                    k = k*0.1;
                    num = num + (s[j] - '0')*k;
                    if(k < 0.01){
                        flag = false;
                        break;
                    }
                }
            }
        }
        if(fuhao == false) num = -num;
        if(!(num>=-1000 && num<=1000) ){
            flag = false;
        }
        if(flag){
            count++;
            sum+=num;
        }else{
            cout<<"ERROR: "<<s<<" is not a legal number"<<endl;
        }
    } 
    if(count == 0){
        cout<<"The average of "<<count<<" numbers is Undefined"<<endl;
    }else if(count == 1){
        cout<<"The average of "<<count<<" number is ";
        printf("%.2lf\n", sum / count);
    }else{
        cout<<"The average of "<<count<<" numbers is ";
        printf("%.2lf\n", sum / count);
    }
    return 0;
} 

1109 逻辑题

题目大意: N个人,排列成k队。
排队规则:
1、每列有n/k个人(向下取整),多余的人站最后一列
2、后排的人数必须>=前排的人数
3、 最高的人站在(m/2+1)的位置
4、其他人先矮后高又矮。假设左相对于右高
5、同样的高度,根据姓名的字母表排序,姓名没有重复
见到这种很复杂的输入,又有排序。必定用vector的sort,参数多就定义结构体。

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

typedef struct node{
    string name;
    int height;
}node;

bool cmp(node a, node b){
    if(a.height == b.height){
        return a.name > b.name;
    }
    return a.height < b.height;
}

int main(){
    int n ,k;
    cin>>n>>k; 
    vector<node> v;
    for(int i=0;i<n;i++){
        string n;
        int h;
        cin>>n>>h;
        node temp;
        temp.name = n;
        temp.height = h;
        v.push_back(temp);
    }
    sort(v.begin(), v.end(), cmp);
    
    int m = n / k; //每排几个人 
    int y = n % k; //余数 
    int count = n-1;
    int hang = 0;
    
    vector< vector<string> > ans(k+1);
    
    vector<string> temp(m+y);  //最后一排 
    int p,q;
    temp[(m+y)/2] = v[count--].name;
    for(p = (m+y)/2-1, q = (m+y)/2+1; p>=0 && q<m+y; p--, q++){
        temp[p] = v[count--].name;
        temp[q] = v[count--].name;  
    } 
    if(p==0){
        temp[p] = v[count--].name;
    }
    for(int j=0;j<m+y;j++){
        ans[hang].push_back(temp[j]);
    }
    hang++;
    
    for(int i=0;i<k-1;i++){//前k-1排,没排m个人。
        vector<string> temp(m); 
        int p,q;
        temp[(m)/2] = v[count--].name;
        for(p = (m)/2-1, q = (m)/2+1; p>=0 && q<m; p--, q++){
            temp[p] = v[count--].name;
            temp[q] = v[count--].name;  
        } 
        if(p==0){
            temp[p] = v[count--].name;
        }
        for(int j=0;j<m;j++){
            ans[hang].push_back(temp[j]);
        }
        hang++;
    }
    
    for(int i = 0; i < hang; i++){
        for(int j = 0; j<ans[i].size();j++){
            if(j!=0){
                cout<<" ";
            }
            cout<<ans[i][j];
        }
        cout<<endl;
    }
    return 0;
}

1110 树

题目大意: 给一个树,求是否是是一个完全二叉树

#include<iostream>
#include<map>
#include<string.h>
#include<vector>
#include<stdlib.h>
using namespace std;

typedef struct node{
    char l,r;
}node;

int n;
map<int, node> tree;
int root = 0;
int have[25] = {0};
int num,ans;

void dfs(int r, int index){
    if(index > num){
        num = index;
        ans = r;
    }
    if(tree[r].l != -1){
        dfs(tree[r].l,index*2);
    } 
    if(tree[r].r != -1){
        dfs(tree[r].r,index*2+1);
    }
    return ;
}

int main(){
    cin>>n; // <=20
    for(int i=0;i<n;i++){
        char a[5],b[5];
        cin>>a>>b;
        node temp;
        if(a[0] == '-'){
            temp.l = -1;
        }else{
            temp.l = atoi(a);
            have[temp.l] = 1;
        }
        if(b[0] == '-'){
            temp.r = -1;
        }else{
            temp.r = atoi(b);
            have[temp.r] = 1;
        }
        tree[i] = temp;
    }
    
    //没有指向的,就是root
    while(have[root] != 0) root++;  
    
    dfs(root, 1);
    
    if(num==n) cout<<"YES "<<ans<<endl;
    else cout<<"NO "<<root<<endl;
        
    return 0;
}

1111 最短路径

题目大意: 给出起点和终点,找出最短路和最快路
一个求最短路径(如果相同求时间最短的那条),一个求最快路径(如果相同求结点数最小的那条)
思路: 两次狄更斯+DFS即可。

#include<iostream>
#include<cstdio>
#include<vector>
#define inf 99999999
using namespace std;

int n, m;
int cost[505][505],time0[505][505];
int dis[505];
bool visit[505];
vector<int> temppath,path, pathcopy;
vector<int> pre[510];
int minnode, mintime;
int s,d; 

void dfscost(int v){
    //cout<<v<<" ";
    temppath.push_back(v);
    if(v == s){
        int tempcost = 0;
        for(int i=temppath.size()-1; i>0; i--){
            int id = temppath[i], nextid = temppath[i-1];
            tempcost += time0[id][nextid];
        }
        if(tempcost < mintime){
            mintime = tempcost;
            path = temppath;
        }
        temppath.pop_back();
        return;
    }
    for(int i = 0;i<pre[v].size();i++){
        dfscost(pre[v][i]);
    }
    temppath.pop_back();
}

void dfstime(int v){
    temppath.push_back(v);
    if(v==s){
        if(temppath.size() < minnode){
            minnode = temppath.size();
            path = temppath;
        }
        temppath.pop_back();
        return ;
    }
    for(int i=0;i<pre[v].size();i++){
        dfstime(pre[v][i]);
    }
    temppath.pop_back();
}

int main(){
    
    cin>>n>>m;
    
    fill(cost[0],cost[0]+505*505,inf);
    fill(time0[0],time0[0]+505*505,inf);
    fill(dis, dis+505, inf);
    
    for(int i=0;i<m;i++){
        int u,v, flag, l,t;
        cin>>u>>v>>flag>>l>>t;
        cost[u][v] = l;
        time0[u][v] = t;
        if(flag == 0){
            cost[v][u] = l;
            time0[v][u] = t;
        }
    }   
    cin>>s>>d;
    
    pre[s].push_back(s);
    dis[s] = 0;
    for(int i=0;i<n;i++){
        int u = -1 , minn = inf;
        for(int j=0;j<n;j++){
            if(visit[j] == false && dis[j] < minn ){
                u = j;
                minn = dis[j];
            }
        }
        if(u == -1) break;
        visit[u] = true;
        for(int v = 0;v<n;v++){
            if(visit[v] == false && cost[u][v]!=inf){
                if(dis[v] > dis[u] + cost[u][v]){
                    dis[v] = dis[u]+cost[u][v];
                    pre[v].clear();
                    pre[v].push_back(u);
                }else if(dis[v] == dis[u] + cost[u][v]){
                    pre[v].push_back(u);
                }
            }
        }
    }
    mintime = inf;
    dfscost(d); 
    pathcopy = path;
    int disans = dis[d];
    
    fill(dis, dis+505, inf);
    fill(visit, visit+505, false);
    for(int i=0;i<510;i++){
        pre[i].clear();
    }
    temppath.clear();
    path.clear();
    pre[s].push_back(s);
    dis[s] = 0;
    for(int i=0;i<n;i++){
        int u = -1 , minn = inf;
        for(int j=0;j<n;j++){
            if(visit[j] == false && dis[j] < minn){
                u = j;
                minn = dis[j];
            }
        }
        if(u == -1) break;
        visit[u] = true;
        for(int v = 0;v<n;v++){
            if(visit[v] == false && time0[u][v]!=inf){
                if(dis[v] > dis[u] + time0[u][v]){
                    dis[v] = dis[u] + time0[u][v];
                    pre[v].clear();
                    pre[v].push_back(u);
                }else if(dis[v] == dis[u] + time0[u][v]){
                    pre[v].push_back(u);
                }
            }
        }
    }
    minnode = inf;
    dfstime(d); 
    
    cout<<"Distance = "<<disans;
    if(pathcopy == path){
        cout<<"; ";
    }else{
        cout<<": ";
        for(int i = pathcopy.size()-1; i>=0; i--){
            if( i != pathcopy.size()-1){
                cout<<" -> ";
            }
            cout<<pathcopy[i];
        }
        cout<<endl;
    }
    
    cout<<"Time = "<<dis[d]<<": ";
    for(int i = path.size()-1; i>=0; i--){
        if( i != path.size()-1){
            cout<<" -> ";
        }
        cout<<path[i];
    }
    cout<<endl;
    
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,980评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,178评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,868评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,498评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,492评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,521评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,910评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,569评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,793评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,559评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,639评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,342评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,931评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,904评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,144评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,833评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,350评论 2 342