PAT 1001--1010

1001

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

int main()
{
    int a,b,result;
    cin>>a>>b;
    result=a+b;
    if(result<0){
        cout<<"-";
        result=0-result;
    }
    if(result==0)
    {
        cout<<result;
        return 0;
    }
    vector<int> ans;
    while(result!=0)
    {
        int i=result%10;
        ans.push_back(i);
        result=result/10;
    }
    for(int i=ans.size()-1;i>=0;i--)
    {
        cout<<ans[i];
        if(i!=0&&i%3==0)
            cout<<',';
    }
    return 0;
}

1002

#include<iostream>
#include<cstdio>
using namespace std;
double ans[1001]={0};
int main()
{
    int K,a;
    double c;
    cin>>K;
    for(int i=0;i<K;i++)
    {
        cin>>a>>c;
        ans[a]=c;
    } 
    cin>>K;
    for(int i=0;i<K;i++)
    {
        cin>>a>>c;
        ans[a]=c+ans[a];
    } 
    int num=0;
    for(int i=0;i<1001;i++)
    {
        if(ans[i]!=0)num++;
    }
    cout<<num;
    for(int i=1000;i>=0;i--)
    {
        if(ans[i]!=0){
            printf(" %d %.1f",i,ans[i]);
        }
    } 
}

运用map

#include<iostream>
#include<map>
#include<cstdio>
using namespace std;
map<int,double> ans;

int main()
{
    int K,a;
    double c;
    cin>>K;
    while(K--)
    {
        cin>>a>>c;
        ans[a]=c;
    }
    
    cin>>K;
    while(K--)
    {
        cin>>a>>c;
        ans[a]=ans[a]+c;
        if(ans[a]==0) ans.erase(a);
    }
    /*for(auto it=ans.begin();it!=ans.end();it++){
        if(ans[a]==0) ans.erase(a);
    }*/
   
    cout<<ans.size();
    for(auto it=ans.end();it!=ans.begin();)
    {
        it--;
        printf(" %d %.1f",it->first,it->second);
    }

}

1003

#include<iostream>
#include<vector>
using namespace std;
int N,M,C1,C2;//N城市数目,M道路数目,C1起点,C2终点
int num_of_team[501];
vector<int> road[501];
int dist[501][501];
int min_dist[501];
int paths,teams;
void dfs(int now_id,int now_length,int now_team)
{
    
    if(min_dist[now_id]<now_length)return;//递归时不会递归回去的方法
    if(now_id==C2){
        if(min_dist[now_id]>now_length){
            min_dist[C2]=now_length;
            paths=1;
            teams=now_team;
        }
        else{
            paths++;
            if(now_team>teams)teams=now_team;
        }
    }
    else{   
        if(now_length<min_dist[now_id])min_dist[now_id]=now_length;
        for(int i=0;i<road[now_id].size();i++){
            dfs(road[now_id][i],now_length+dist[now_id][road[now_id][i]],now_team+num_of_team[road[now_id][i]]);
        }
    }
}
int main()
{
    
    cin>>N>>M>>C1>>C2;
    int i,j,k,l;
    for(int i=0;i<N;i++) cin>>num_of_team[i];
    while(M--){
        cin>>i>>j>>l;
        road[i].push_back(j);
        road[j].push_back(i);
        dist[i][j]=dist[j][i]=l; 
    }//图输入完毕
    for(int i=0;i<N;i++) min_dist[i]=99999999;
    dfs(C1,0,num_of_team[C1]);
    cout<<paths<<' '<<teams;
}

1004

#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
const int N = 110;
vector<int> G[N];//N个结点
int leaf[N] = { 0 };//每一层的叶子结点的个数,N个结点顶多有N层,所以申请leaf[N]没有问题
int max_h = 1;
void DFS(int index, int h) {//深度遍历整个树,顺便记录树深,统计h层叶节点个数
    max_h = max(h, max_h);
    if (G[index].size() == 0) {
        leaf[h]++;
        return;
    }
    for (int i = 0; i < G[index].size(); i++) {
        DFS(G[index][i], h + 1);
    }
}
int main() {
    int n, m, parent, child, k;
    //n,结点个数;m,非叶节点个数;parent,非叶节点id;child,对应儿子节点id;k,儿子结点个数
    cin >> n >> m;
    for (int i = 0; i < m; i++) 
    {
        cin >> parent >> k;
        for (int j = 0; j < k; j++) {
            cin >> child;
            G[parent].push_back(child);
        }
    }
    DFS(1, 1);
    cout << leaf[1];
    for (int i = 2; i <= max_h; i++) cout<<' '<< leaf[i];
    return 0;
}

1005

#include<iostream>
#include<vector>
#include<string>
#include<map>
using namespace std;
map<int,string> a;
string N;
void inio()
{
	a[0] = "zero";
	a[1] = "one";
	a[2] = "two";
	a[3] = "three";
	a[4] = "four";
	a[5] = "five";
	a[6] = "six";
	a[7] = "seven";
	a[8] = "eight";
	a[9] = "nine";
}

int main()
{
    inio();
	cin>>N;
    int sum=0;
	for (int i = 0; i < N.size(); i++)
	{
		sum += (int)N[i]-'0';
	}
    string s=to_string(sum);
    for(int i=0;i<s.size();i++){
        if(i>0) cout<<' ';
        cout<<a[s[i]-'0'];
    }
    return 0;
}

1006

#include<iostream>
#include<string>
using namespace std;
//直接利用字典序比较大小,比较大小的方法为两个字符串从左往右比较字符,遇到小的字符,说明这个字符串小
int main()
{
	string maxtime = "000000";
	string mintime = "9999999";
	int N;
	cin >> N;
	string id, sigh_in, sigh_out;
	string minid, maxid;
	while (N--) {
		cin >> id >> sigh_in >> sigh_out;
		if (sigh_in < mintime) { mintime = sigh_in; minid = id; }
		if (sigh_out > maxtime) { maxtime = sigh_out; maxid = id; }
	}
	cout << minid << ' ' << maxid;
}

1007

#include<iostream>
using namespace std;
int a[10001] = { 0 };
int front[10001] = { 0 };
int main() {
    int N;
    cin >> N;
    for (int i = 1; i <= N; i++) {
        cin >> a[i];
    }
    //计算前n项和
    front[0] = a[0];
    for (int i = 1; i <= N; i++) {
        front[i] = front[i - 1] + a[i];
    }
    int dp[10001];//dp[i]表示以a[i]字符结尾的串的最大子串和是多少
    dp[0] = 0;
    int max = -1;
    int left,right;
    int lowest = 0;
    for (int i = 1; i <= N; i++) {
        if (dp[i - 1] + a[i] < a[i])//以a[i-1]字符结尾的最大子串给以a[i]结尾的最大子串形成了累赘
        {
            dp[i] = a[i];
            lowest = i - 1;
        }
        else {
            dp[i] = dp[i - 1] + a[i];
        }
        if (dp[i] > max) {
            max = dp[i];
            right = i;
            left = lowest + 1;
        }
    }
    if (max > -1)
    {
        cout << max << ' ' << a[left] << ' ' << a[right];
    }
    else
        cout << 0 << ' ' << a[1] << ' ' << a[N];

}

1008

#include<iostream>
using namespace std;
int main(){
    int N;
    cin>>N;
    int current=0;
    int sum_time=0;
    while(N--){
        int k;
        cin>>k;
        if(current<k)//需要上楼
        {
            sum_time+=6*(k-current)+5;
            current=k;
        }
        else{
            sum_time+=4*(current-k)+5;
            current=k;
        }
    }
    cout<<sum_time;
}

1009


#include<iostream>
#include<iomanip>
using namespace std;


double a[1001] = { 0 };
double b[1001] = { 0 };
double c[2002] = { 0 };

void solve() {
	for (int i = 0; i <= 1000; i++) {
		for (int j = 0; j <= 1000; j++) {
			c[i + j] += a[i] * b[j];
		}
	}
	int cnt = 0;
	for (int i = 2000; i >= 0; i--) {
		if (c[i] != 0) ++cnt;
	}
	//printf("%d", cnt);
	cout << cnt;
	for (int i = 2000; i >= 0; i--) {
		if (c[i] == 0) continue;
		cout << ' ' << i << ' ' << setiosflags(ios::fixed) << setprecision(1) << c[i];
	}
}

int main() {
	int k, p;
	double q;
	cin >> k;
	for (int i = 1; i <= k; i++) {
		cin >> p >> q;
		a[p] = q;
	}
	cin >> k;
	for (int i = 1; i <= k; i++) {
		cin >> p >> q;
		b[p] = q;
	}
	solve();
	return 0;
}

1010

#include<iostream>
#include<vector>
#include<string>
using namespace std;
int trans(char c) {
    int re = -1;
    if (c >= '0' && c <= '9') { re = c - '0'; };
    if (c >= 'a' && c <= 'z') { re = 10 + c - 'a'; }
    return re;
}
int N_translate(string N, int radix)//将N转化为十进制的数
{
    int unit = 1, sum = 0;
    for (int i = N.size() - 1; i >= 0; i--) {
        sum += trans(N[i]) * unit;
        unit = unit * radix;
    }
    return sum;
}
int main() {
    string N, U, N1, N2;
    int tag, radix;
    cin >> N1 >> N2 >> tag >> radix;
    if (tag == 1) { N = N1; U = N2; }
    if (tag == 2) { N = N2; U = N1; }//这样下来,radix就是N的进制,寻找U的一个最小进制r,U=N
    int temp = N_translate(N, radix);


    int Maxdigit = trans(U[0]);
    for (int i = 1; i < U.size(); i++) {
        if (trans(U[i]) > Maxdigit)Maxdigit = trans(U[i]);
    }
    int r2;
    for (r2 = Maxdigit+1; N_translate(U, r2) < temp; r2++);
    
    if (N_translate(U, r2) == temp) {
        cout << r2;
    }
    else {
        cout << "Impossible";
    }
    return 0;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值