2019 字节跳动 [编程题]最大映射(贪心)
Posted ccsu-kid
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2019 字节跳动 [编程题]最大映射(贪心)相关的知识,希望对你有一定的参考价值。
https://www.nowcoder.com/question/next?pid=1649268&qid=44705&tid=28244198
对每一种字母设定一个权值v,权值越大说明应该置为越大的数,然后按权值排序。
d[i]表示字母i+‘A‘对应的数,e[i]表示i这个数对应的字母;
如果有前导0,找到第一个不会构成前导0的数,然后从这个数开始交换字母。
1 #define bug(x) cout<<#x<<" is "<<x<<endl 2 #define IO std::ios::sync_with_stdio(0) 3 #define ull unsigned long long 4 #include <bits/stdc++.h> 5 #define iter ::iterator 6 #define pa pair<int,ll> 7 #define pp pair<int,pa> 8 using namespace std; 9 #define ll long long 10 #define mk make_pair 11 #define pb push_back 12 #define se second 13 #define fi first 14 #define ls o<<1 15 #define rs o<<1|1 16 ll mod=998244353; 17 const int N=2e5+5; 18 ll p[100]; 19 ll a[100]; 20 char s[100][100]; 21 int T,n; 22 struct node 23 int id; 24 ll v; 25 b[100]; 26 bool cmp(node n1,node n2) 27 return n1.v>n2.v; 28 29 int d[100],e[100]; 30 int main() 31 p[0]=1; 32 for(int i=1;i<=12;i++) 33 p[i]=p[i-1]*10; 34 35 scanf("%d",&T); 36 for(int z=1;z<=T;z++) 37 scanf("%s",s[z]+1); 38 n=strlen(s[z]+1); 39 int h=1; 40 for(int i=n;i>=1;i--) 41 int c=s[z][i]-‘A‘; 42 a[c]+=p[h]; 43 h++; 44 45 46 for(int i=0;i<10;i++) 47 b[i].id=i; 48 b[i].v=a[i]; 49 50 sort(b,b+10,cmp); 51 for(int i=0;i<10;i++) 52 int k=b[i].id; 53 d[k]=9-i; 54 e[9-i]=k; 55 56 int id=0; 57 for(int g=0;g<10;g++) 58 int x=e[g]; 59 int f=0; 60 for(int i=1;i<=T;i++) 61 int c=s[i][1]-‘A‘; 62 if(c==x) 63 f=1; 64 break; 65 66 67 if(!f) 68 id=g; 69 break; 70 71 72 for(int i=id;i>0;i--) 73 swap(e[i],e[i-1]); 74 75 for(int i=9;i>=0;i--) 76 d[e[i]]=i; 77 78 ll ans=0; 79 for(int i=1;i<=T;i++) 80 int n=strlen(s[i]+1); 81 ll h=1; 82 ll res=0; 83 for(int j=n;j>=1;j--) 84 int c=s[i][j]-‘A‘; 85 c=d[c]; 86 res+=1ll*c*h; 87 h*=10; 88 89 ans+=res; 90 91 printf("%lld\n",ans); 92
以上是关于2019 字节跳动 [编程题]最大映射(贪心)的主要内容,如果未能解决你的问题,请参考以下文章