比赛地址:https://ac.nowcoder.com/acm/contest/7608
A:
把字符串、编号和价值存放在一个结构体中,用cmp给a数组排序
二维vector b保存着以a~z结尾的价值最大的字符串,可以用O(1)的时间完成查询
总算法时间复杂度O(nlogn)
#include <bits/stdc++.h> using namespace std; struct abc { string s; int jia,id; }; bool cmp(abc f1,abc f2) { if(f1.jia==f2.jia) { return f1.id<f2.id; } return f1.jia>f2.jia; } int main() { int n,m; cin>>n>>m; abc a[n+1]; for(int i=1;i<=n;i++) { cin>>a[i].s>>a[i].jia; a[i].id=i; } sort(a+1,a+1+n,cmp); vector<vector<abc> > b; for(int i=0;i<=26;i++) { b.push_back({}); } for(int i=1;i<=n;i++) { b[a[i].s[a[i].s.size()-1]-'a'].push_back(a[i]); } for(int i=1;i<=m;i++) { char p; int k; cin>>p>>k; if(b[p-'a'].size()<k) { cout<<"Orz YYR tql"<<endl; } else { cout<<b[p-'a'][k-1].s<<endl; } } return 0; }
B:
先算出i和j有多少种最大公约数的可能,因为n<=1000,所以可以把算出的gcd放入a数组中
再计算a数组的每个值和k有多少种可能的gcd,直接相乘即可
总时间复杂度O(n^2)
#include <bits/stdc++.h> using namespace std; int gcd(int a,int b) { if(b==0) return a; else return gcd(b,a%b); } int main() { int n; cin>>n; int a[n+1]; memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { a[gcd(i,j)]++; } } int ans=0; for(int i=1;i<=n;i++) { for(int k=1;k<=n;k++) { ans+=gcd(i,k)*a[i]; } } cout<<ans<<endl; return 0; }
以下为本人笔记:
https://ac.nowcoder.com/discuss/547031?type=101&order=0&pos=9&page=1&channel=-1&source_id=1