思路:用一个数组存放每个数字对应的封闭图形数,输入N,用数组存放,对数组进行冒泡排序之后,然后输出数据。
问题:
1.冒泡排序不会
2.修改后只能过%50样例
解决:
1.冒泡排序,逻辑是先两两比较,保证最后一个数一定是有序的;至少要比较n-1次得到n-1个有序数字,第一个数字一定是有序的。因为有j+1,所以第一次循环只需要循环到n-1,第二次只需要循环到n-2,所以j的范围是1到n-i。
2.sort排序。
代码一
#include <bits/stdc++.h> using namespace std; #define int long long int b[10]={1,0,0,0,1,0,1,0,2,1}; int check(int a) { string s=to_string(a); int sum=0; for(int i=0;i<s.size();i++) { sum+=b[s[i]-'0']; } return sum; } bool is(int a,int c) { int m1=check(a); int m2=check(c); if(m1>m2) { return true; } else if(m1==m2) { if(a>c) { return true; } else { return false; } } return false; } signed main() { int n; cin>>n; int a[n+2]={0}; for(int i=1;i<=n;i++) { cin>>a[i]; } for(int i=1;i<=n-1;i++) { for(int j=1;j<=n-i;j++) { int temp=0; if(is(a[j],a[j+1])) { temp=a[j+1]; a[j+1]=a[j]; a[j]=temp; } } } for(int i=1;i<=n;i++) { cout<<a[i]<<' '; } return 0; }代码二
#include <bits/stdc++.h> using namespace std; #define int long long int b[10]={1,0,0,0,1,0,1,0,2,1}; int check(int a) { string s=to_string(a); int sum=0; for(int i=0;i<s.size();i++) { sum+=b[s[i]-'0']; } return sum; } bool cmp(int a,int b) { int na=check(a); int nb=check(b); if(na!=nb) return na<nb; return a<b; } signed main() { int n; cin>>n; int a[n+2]={0}; for(int i=1;i<=n;i++) { cin>>a[i]; } sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) { cout<<a[i]<<' '; } return 0; }