zoukankan      html  css  js  c++  java
  • PTA 1081~1085

    今天总结一下,昨天做的pta的题~

    [1081:检查密码](https://pintia.cn/problem-sets/994805260223102976/problems/994805261217153024) 

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    
    int main(){
    	int n;
    	cin >> n;
    	getchar();// 吃回车
    	for(int i = 0 ; i < n ; i ++){
    		int numa = 0,numn = 0, nump = 0;
    		string u;
    		getline(cin,u); //getline  
    		int len = u.length();
    		if(len < 6)
    		{
    			cout <<"Your password is tai duan le."<<endl; 
    		}
    		else{
    			for(int i = 0; i < len ; i ++){
    				if((u[i]<='z' && u[i]>='a') || (u[i]>='A'&& u[i] <= 'Z')){
    					numa++;
    				}
    				else if(u[i]>='0' && u[i]<='9'){
    					numn++;
    				} 
    				else{
    					if(u[i] != '.')
    					nump++;
    				}
    			}
    				//cout << numa << " " << numn << " " << nump << endl;
    			if(nump){
    				cout << "Your password is tai luan le."<<endl;
    				continue;
    			}
    			else if(!numa&&numn){
    				cout << "Your password needs zi mu."<<endl;
    				continue;
    			}
    			else if(numa&&!numn){
    				cout <<"Your password needs shu zi." <<endl;
    				continue;
    			}
    			
    			else if(numa&&numn){
    				cout << "Your password is wan mei." <<endl;
    				continue;
    			}
    		}
    		
    	}
    } 
    

      1:这道题主要注意的是,输入的密码会有空格,所以不能简单地用string的cin 输入,得用getline输入一整行,注意格式getline(cin ,s);

            2:在用getline之前还有输入的时候,一定要加getchar(),这里的getchar()吃回车

    [1082 射击比赛](https://pintia.cn/problem-sets/994805260223102976/problems/994805260990660608)

    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<math.h>
    using namespace std;
    struct node{
    	string id;
    	int x,y;
    	double d;
    }N[10005];
    int cmp(node A,node B){
    	return A.d < B.d;
    } 
    int main(){
    	int n;
    	cin >> n;
    	for(int i = 0 ; i < n ; i ++)
    	{
    		cin >>N[i].id;
    		cin >> N[i].x >> N[i].y;
    		N[i].d = sqrt(N[i].x*N[i].x+N[i].y*N[i].y);
    		//cout << N[i].d << endl;
    	}
    	sort(N,N+n,cmp);
    	cout << N[0].id << " " << N[n-1].id;
    }
    

      这道题其实就是求两点之间的距离

    [1083 是否存在相等的差](https://pintia.cn/problem-sets/994805260223102976/problems/994805260780945408)

    #include<iostream>
    #include<algorithm>
    #include<stdio.h>
    #include<string.h>
    #include<map>
    
    using namespace std;
    map<int,int,greater<int>>M;
    int num[10005];
    int main(){
    	int n;
    	cin >> n;
    	for(int i = 1 ; i <= n ; i ++){
    		cin >> num[i];
    		int cha= abs(num[i] - i);
    		M[cha]++;
    	}
    	map<int,int>::iterator it;
    	for(it = M.begin();it!=M.end();it++){
    		if(it->second == 1)
    		continue;
    		cout << it->first << " " << it->second << endl;
    	}
    } 
    

      这道题需要让你把差从大到小的排序,并且输入相应的个数,当然仔细读题,发现个数出现一次是不需要输入的

           首先让我想到STL库里的map,但是这里需要从大到小,所以用

    map<int,int,greater<int>>M;来定义一个key值从大到小的Map;
    map<int,int,less<int>>M; 用来定义一个key值从小到大的Map;(当然变量名随意啦~)





    [1084 外观数列](https://pintia.cn/problem-sets/994805260223102976/problems/994805260583813120)


    #include<iostream>
    #include<stdio.h>
    #include<algorithm>
    #include<string.h>
    #include<map>
    using namespace std;
    string a;
    map<int,int>M;
    int n,m;
    void form(string &a,map<int,int>&M,int num ){
    	if(num == m){
    		cout << a << endl;
    		return ;	
    	}
    
    	string b;
    	int len = a.length();
    	int ans = 1;
    	for(int i = 0 ; i < len; i ++){
    		if(a[i+1] == a[i]){
    			++ans;
    			continue;
    		}else{
    			M[a[i]-'0'] = ans;
    			b += ( a[i]-'0' +'0' );
    			b += ( ans +'0');
    			ans = 1;
    		}
    	}
    	a = b;
    	b.clear();
    	M.clear();
    	form(a,M,num+1);
    	
    }
    int main(){
    	cin >> n >> m;
    	a = n+'0';
    	form(a,M,1);
    } 
    

     这道题我用的思想主要是递归~

    [1085 pat单位排行](https://pintia.cn/problem-sets/994805260223102976/problems/994805260353126400)

    #include<iostream>
    #include<algorithm>
    #include<stdio.h>
    #include<string.h>
    #include<map>
    using namespace std;
    struct node{
    	double score;
    	int num=0;
    	string sc;
    }re[100005];
    int cmp(node A,node B){
    	if(A.score != B.score){
    		return A.score > B.score;
    	}else{
    		if(A.num != B.num)
    		return A.num < B.num;
    		else
    		return A.sc < B.sc;
    	}
    }
    map<string,node>M;
    int main(){
    	int n;
    	cin >> n;
    	for(int i = 1 ; i <= n ;i ++){
    		string a,sch;
    		double p;
    		double pp;
    		cin >> a >> p >> sch;
    		transform( sch.begin(), sch.end() ,sch.begin(), ::tolower);
    		//cout << sch <<endl;
    		if(a[0] == 'B')
    		p /=1.5;
    		else if(a[0] == 'T')
    		p*=1.5;
    		pp = p; 
    		M[sch].score+=pp;
    		M[sch].num++;
    		
    	}
    	map<string,node>::iterator it;
    	int i = -1;
    	for(it = M.begin(); it!=M.end(); it++){
    		 re[++i].sc = it->first;
    		 re[i].num = it->second.num;
    		 re[i].score = (int)it->second.score;
    	}
    	sort(re,re+i+1,cmp);
    	int rank = 0;
    	int ll = 0;
    	cout << M.size() << endl;
    	for(int j = 0 ; j <= i ;j ++){
    		if(re[j].score == re[j-1].score){
    			ll++;
    			cout << rank << " ";
    		}else{
    			cout <<(rank+ll+1) <<" ";
    			rank += ll +1;
    			ll = 0;
    			}
    			cout << re[j].sc << " " << re[j].score << " " <<re[j].num << endl;
    			
    		
    	}
    	
    
    } 
    

      首先一定要注意成绩的计算,double类型,并且输出的时候需要输出整数,呢就再变为int类型

           第二,排名的输入读者应该仔细思考一下,之前没怎么全面,提交一直是20,好在终于发现了错误并且改正

     



  • 相关阅读:
    爱情戒指
    李小龙
    20分钟
    大话JAVA(二)
    编程高手
    Free Computer Books, Free eBooks and Read Free Books Online
    (06) [修正版] 判断整数序列是不是二元查找树的后序遍历结果
    [原创]DateTime在使用 format Custom Date and Time Format Strings时遇到的问题和解决方法
    [原创]00:矩形算法题二分法的扩展(2分法 * 2分法)
    用堆栈和用递归分别实现倒序打印
  • 原文地址:https://www.cnblogs.com/wtzmz/p/14457963.html
Copyright © 2011-2022 走看看