PAT甲级(1001-1005)

1001

在这里插入图片描述

#include <iostream>
#include <vector>
#include <iomanip>
#include <math.h>
#include <string>
#include <sstream>
#include <stack>

 using namespace std;


 int main(){
   long long a,b;
   cin>>a>>b;
   string st;
   stringstream ss;
   ss<<(a+b);
   ss>>st;
   int th_count=0;
   stack <char> sta;
   for (int i=st.size()-1;i>=0;i--){
        th_count++;
        sta.push(st[i]);
        if (i == 0){break;}
        if (st[i-1] == '-'){sta.push(st[i-1]);break;}
        if (th_count % 3 == 0&&th_count!=0){sta.push(',');}
   }
   while (!sta.empty()){cout<<sta.top();sta.pop();}
   return 0;
 }

总结陈词

1、long,int 和string的转化。参考链接。
https://blog.csdn.net/sunxianliang1/article/details/72897045

1002

在这里插入图片描述
下面这段代码显示部分正确, 原因未知,得分(17/25)

#include <iostream>
#include <vector>
#include <iomanip>
#include <math.h>
#include <string>
#include <sstream>
#include <stack>

 using namespace std;


 int main(){
    float x;
    vector <float> vc1;
    vector <float> vc2;
    vector <float> result;
    int num;
    cin>>num;
    while(num--){
        cin>>x;
        vc1.push_back(x);
        cin>>x;
        vc1.push_back(x);
    }
    cin>>num;
    while(num--){
        cin>>x;
        vc2.push_back(x);
        cin>>x;
        vc2.push_back(x);
    }
    unsigned int length;
    if (vc1.size()<vc2.size()){length = vc1.size();}
    else {length = vc2.size();}
    unsigned int i,j;
    i=0;j=0;
    unsigned int length_copy = length;
    float sum=0;
    while(length_copy--){
        if(vc1[i]<vc2[j]){result.push_back(vc2[j]);result.push_back(vc2[++j]);j++;sum++;}
        else if(vc1[i]>vc2[j]){result.push_back(vc1[i]);result.push_back(vc1[++i]);i++;sum++;}
        else{result.push_back(vc1[i]);result.push_back(vc1[++i]+vc2[++j]);i++;j++;sum++;}
        if (i == length){while(j<vc2.size()){result.push_back(vc2[j++]);sum+=0.5;}break;}
        if (j == length){while(i<vc1.size()){result.push_back(vc1[i++]);;sum+=0.5;}break;}
    }
    cout<<setiosflags(ios::fixed) << setprecision(0)<<sum;
    for (unsigned int i=0;i<result.size();i++){
        cout<<' ';
        if (i&1)cout<<setiosflags(ios::fixed) << setprecision(1)<<result[i];
        else{cout<<setiosflags(ios::fixed) << setprecision(0)<<result[i];}
    }
    return 0;
 }

下面方法来自
https://blog.csdn.net/i_hope_soar/article/details/83064733

#include <iostream>
#include <iomanip>
using namespace std;
double a[1005];
int main(){
	int n,k,x,m,count = 0;
	double y;
	cin>>m;
	for(int i = 0; i < m; i++){
		cin>>x>>y;
		a[x] += y;
	}
	cin>>m;
	for(int i = 0; i < m; i++){
		cin>>x>>y;
		a[x] += y;
	}
	for(int i = 0; i < 1001; i++){
		if(a[i] != 0) count++;
	}
	cout<<count;
	for(int i = 1001; i >= 0; i--){
		if(a[i] != 0){
			cout<<" "<<i<<" "<<setiosflags(ios::fixed)<<setprecision(1)<<a[i];
		}
	}
	return 0;
}

总结陈词

1、当如下情况时,++j会优先与cout计算,产生输出错误。

cout<<a[i]<<a[++i];//输出为两个a[i+1]

2、控制小数点位数参考链接
https://www.cnblogs.com/ever17/p/11285358.html
3、没有必要用vector容器,可以直接用数组预定数组空间。虽然有浪费,但是测试能过呀。

1003

在这里插入图片描述

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>

using namespace std;

const int MAXV = 1000;//最大顶点数
const int INF = 100000;//一个很大的数

int n;//顶点数
int m;//边数
int s;//起点序号
int G[MAXV][MAXV];
int d[MAXV];//起点到各点的路径长度
bool vis[MAXV] = {false};//true表示已访问
int man[MAXV];//各个结点救援人员数目
int mannum[MAXV];//从起点到各个点的聚集人数
int num[MAXV];//最短路径条数

void Dijkstra(int s){//s是起点
    fill(d,d+MAXV,INF);//将数组设为INF
    memset(num,0,sizeof(num));
    memset(mannum,0,sizeof(mannum));
    d[s] = 0;//s到自己的距离是0
    mannum[s] = man[s];
    num[s] = 1;
    for (int i=0;i<n;i++){
        int u = -1;
        int MIN = INF;//u使得d[u]最小,MIN存放最小的d[u]
        for (int j=0;j<n;j++){//找到为访问的顶点中的d[]最小的
            if (vis[j] == false && d[j]<MIN){
                u  = j;
                MIN = d[j];
            }
        }
        //找不到小于INF,说明s和剩下的顶点不连通
        if (u == -1){return;}
        vis[u] = true;
        for (int v=0;v<n;v++){
            //v更优
            if (vis[v] == false && G[u][v]!=INF){
                if (d[u]+G[u][v]<d[v]){//路径更短
                    d[v] = d[u] + G[u][v];
                    mannum[v] = man[v]+mannum[u];
                    num[v] = num[u];
                }
                else if (d[u]+G[u][v] == d[v]){//路径相同选人多的,else if 不能变
                    if (mannum[v] < man[v]+mannum[u]){
                        mannum[v] = man[v]+mannum[u];
                    }
                    num[v] += num[u];
                }
            }
        }
    }
}

int main(){
    //freopen("D://case.txt","r",stdin);
    cin>>n>>m>>s;//输入顶点数,边数,起点
    int goal;
    cin>>goal;//目标结点
    for (int i=0;i<n;i++){
        cin>>man[i];
    }
    fill(G[0],G[0]+MAXV*MAXV,INF);//初始化
    for (int i=0;i<m;i++){
        int u,v,dis;
        cin>>u>>v;//无向
        cin>>dis;
        G[u][v] = dis;//边权
        G[v][u] = dis;//边权
    }
    Dijkstra(s);
    cout<<num[goal]<<' ';
    cout<<mannum[goal];
    return 0;
}

1004

在这里插入图片描述

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>

using namespace std;

const int MAXN = 110;

vector <int> node[MAXN];
int n,m;//n结点数目,m非叶结点数目
int leaf[MAXN];//每层叶子结点数目
int maxh = 0;//最大高度,方便输出leaf

void DFS(int h,int index){//当前判断结点,第h层
    maxh = max(maxh,h);
    if (node[index].empty()){leaf[h]++;return;}
    for (int i=0;i<node[index].size();i++){
        DFS(h+1,node[index][i]);
    }
}

int main(){
    //freopen("D://case.txt","r",stdin);
    std::ios::sync_with_stdio(false);//加速输入C++
    cin>>n>>m;
    for (int i=0;i<m;i++){
        int father,k,kid;
        cin>>father>>k;
        for (int j=1;j<=k;j++){
            cin>>kid;
            node[father].push_back(kid);
        }
    }
    DFS(1,1);
    cout<<leaf[1];
    for (int i=2;i<=maxh;i++){
        cout<<' '<<leaf[i];
    }
}

1005

https://pintia.cn/problem-sets/994805342720868352/problems/994805519074574336
在这里插入图片描述

#include <cstdio>
#include <algorithm>
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
#include <stack>

using namespace std;

int result = 0;

void sum(char x){
    result += x-'0';
}

stack <string> dig;//各个数字

void turn(int x){
    switch(x){
        case 1:
            dig.push("one");break;
        case 2:
            dig.push("two");break;
        case 3:
            dig.push("three");break;
        case 4:
            dig.push("four");break;
        case 5:
            dig.push("five");break;
        case 6:
            dig.push("six");break;
        case 7:
            dig.push("seven");break;
        case 8:
            dig.push("eight");break;
        case 9:
            dig.push("nine");break;
        case 0:
            dig.push("zero");break;
    }
}


int main(){
    //freopen("D://case.txt","r",stdin);
    std::ios::sync_with_stdio(false);//加速输入C++
    string str;
    cin>>str;
    if (str == "0"){cout<<"zero";return 0;}
    for (int i=0;i<str.size();i++){
        sum(str[i]);
    }
    while(result!=0){
       turn(result%10);
       result = result/10;
    }
    cout<<dig.top();
    dig.pop();
    while(!dig.empty()){cout<<' '<<dig.top();dig.pop();}
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值