2 条题解

  • 0
    @ 2023-12-24 19:52:16

    此题唯一难在排序。由于数的个数不超过 50005000,可以使用冒泡排序,排序函数如下:

    bool cmp(string a,string b,int Alen,int Blen){
    	if(Alen!=Blen)return Alen>Blen;//先比较整数部分长度
    	int len=min(a.size(),b.size());
    	for(int i=0;i<len;i++){
    		if(a[i]>b[i])return 1;//大于
    		if(a[i]<b[i])return 0;//小于
    		if(a[i]==b[i])continue;
    	}
    	return a.size()>b.size();//全部相同比较长度
    }
    void bubble(){//冒泡排序
    	for(int i=1;i<cnt;i++){
    		for(int j=i+1;j<=cnt;j++){
    			if(cmp(num[i].num,num[j].num,num[i].INTlen,num[j].INTlen))
    				swap(num[i],num[j]);
    		}
    	}
    }
    

    对数的处理:

    for(int i=0;i<s.size();i++){
    	if(isdigit(s[i])){
    		num[cnt].num+=s[i];
    		if(f==0)num[cnt].INTlen++;//有了小数点不再计入整数部分长度
    	}
    	else if(s[i]=='.')num[cnt].num+=s[i],f=1;//已有小数点
    	else if(isdigit(s[i-1]))num[cnt].ALLlen=num[cnt].num.size(),cnt++,f=0;//总长度,是否小数点有变量 f 恢复
    }
    

    综合代码如下:

    #include<bits/stdc++.h>
    using namespace std;
    int cnt=1;
    string s;
    bool f;
    struct node{
    	int ALLlen,INTlen;
    	string num;
    }num[10005];
    bool cmp(string a,string b,int Alen,int Blen){
    	if(Alen!=Blen)return Alen>Blen;
    	int len=min(a.size(),b.size());
    	for(int i=0;i<len;i++){
    		if(a[i]>b[i])return 1;
    		if(a[i]<b[i])return 0;
    		if(a[i]==b[i])continue;
    	}
    	return a.size()>b.size();
    }
    void bubble(){
    	for(int i=1;i<cnt;i++){
    		for(int j=i+1;j<=cnt;j++){
    			if(cmp(num[i].num,num[j].num,num[i].INTlen,num[j].INTlen))
    				swap(num[i],num[j]);
    		}
    	}
    }
    int main(){
    	ios::sync_with_stdio(false);
    	cin.tie(0),cout.tie(0);
    	getline(cin,s);
    	for(int i=0;i<s.size();i++){
    		if(isdigit(s[i])){
    			num[cnt].num+=s[i];
    			if(f==0)num[cnt].INTlen++;
    		}
    		else if(s[i]=='.')num[cnt].num+=s[i],f=1;
    		else if(isdigit(s[i-1]))num[cnt].ALLlen=num[cnt].num.size(),cnt++,f=0;
    	}
    	bubble();
    	cout<<num[cnt].num;
    	return 0;
    }
    

    已 AC,请放心

    • 0
      @ 2023-3-17 20:42:42
      #include<bits/stdc++.h>
      using namespace std;
      //输入保证正确
      //输出看仔细
      //所有情况都测
      //数组定义,保证正确
      string s;
      bool check(string s1,string s2)
      {
      	int f = 0,zs2=0,xs2=0,f1=0,f2=0;
      	for(int i = 0;i < s1.size();i ++)
      	{
      		if(s1[i]=='.')
      		{
      			f1=i;
      		}
      	}
      	for(int i = 0;i < s2.size();i ++)
      	{
      		if(s2[i]=='.')
      		{
      			f2=i;	
      		}
      	}
      	if(f1==0)
      		f1=s1.size();
      	if(f2==0)
      		f2=s2.size();
      	if(f1!=f2)
      		return f1<f2;
      	for(int i = 0;i < f1;i ++)
      	{
      		if(s1[i]<s2[i])
      			return true;
      		if(s1[i]>s2[i])
      			return false;
      	}
      	for(int i = f1+1;i < min(s1.size(),s2.size());i ++)
      	{
      		if(s1[i]<s2[i])
      			return true;
      		if(s1[i]>s2[i])
      			return false;
      	}
      	return s1.size()<s2.size();
      }
      int main()
      {
      	getline(cin,s);
      	string t = "" , ma="";
      	s=s+'!';
      	for(int i = 0;i < s.size();i++)
      	{
      		if(isdigit(s[i])||s[i]=='.')
      			t=t+s[i];
      		else
      		{
      			if(t!=""&&check(ma,t))
      				ma=t;
      			t="";
      		}
      //		cout<<t<<" ";
      	}
      	cout<<ma;
       	return 0;
      }
      
      • 1

      信息

      ID
      460
      时间
      1000ms
      内存
      256MiB
      难度
      3
      标签
      递交数
      40
      已通过
      24
      上传者