排序
十大排序讲解传送门
R7-1 魔法优惠券 (25 分)
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
int a[N];
int b[N];
int az[N];
int bz[N];
int af[N];
int bf[N];
int za;
int zb;
int fa;
int fb;
bool cmp(int x,int y){
return x>y;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>0) az[++za]=a[i];
if(a[i]<0) af[++fa]=a[i];
}
int m;
cin>>m;
for(int i=1;i<=m;i++){
cin>>b[i];
if(b[i]>0) bz[++zb]=b[i];
if(b[i]<0) bf[++fb]=b[i];
}
sort(az+1,az+1+za,cmp);
sort(bz+1,bz+1+zb,cmp);
sort(af+1,af+1+fa);
sort(bf+1,bf+1+fb);
int i=1;
int j=1;
int ans=0;
while(i<=za&&j<=zb){
ans+=az[i++]*bz[j++];
}
i=j=1;
while(i<=fa&&j<=fb){
ans+=af[i++]*bf[j++];
}
cout<<ans<<endl;
return 0;
}
R7-2 抢红包 (25 分)
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
struct node{
int sum;
int tot;
int id;
}dp[N];
bool cmp(node x,node y){
if(x.sum>y.sum) return 1;
if(x.sum==y.sum&&x.tot>y.tot) return 1;
if(x.sum==y.sum&&x.tot==y.tot&&x.id<y.id) return 1;
return 0;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
dp[i].id=i;
int k;
cin>>k;
while(k--){
int p,x;
cin>>p>>x;
dp[p].sum+=x;
dp[i].sum-=x;
dp[p].tot++;
}
}
sort(dp+1,dp+1+n,cmp);
for(int i=1;i<=n;i++){
printf("%d %.2f\n",dp[i].id,dp[i].sum*1.0/100);
}
return 0;
}
R7-3 集合相似度 (25 分)
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
set<ll>st[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int k;
cin>>k;
while(k--){
int x;
cin>>x;
st[i].insert(x);
}
}
int q;
cin>>q;
while(q--){
int x,y;
cin>>x>>y;
int xx=st[x].size();
int yy=st[y].size();
int tot=0;
for(auto it=st[x].begin();it!=st[x].end();it++){
if(st[y].count(*it)) tot++;
}
printf("%.2f%%\n",tot*100.0/(xx+yy-tot));
}
return 0;
}
R7-4 悄悄关注 (25 分)
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
struct node{
string s;
int num;
}dp[N];
set<string>st;
set<string>ans;
int main(){
int n;
cin>>n;
string s;
for(int i=1;i<=n;i++){
cin>>s;
st.insert(s);
}
int q;
cin>>q;
int sum=0;
for(int i=1;i<=q;i++){
cin>>dp[i].s>>dp[i].num;
sum+=dp[i].num;
}
// cout<<sum<<endl;
sum/=q;
// cout<<sum<<endl;
for(int i=1;i<=q;i++){
if(dp[i].num>sum&&!st.count(dp[i].s)) ans.insert(dp[i].s);
}
if(!ans.size()) cout<<"Bing Mei You"<<endl;
else {
set<string>::iterator it;
for(it=ans.begin();it!=ans.end();it++){
cout<<(*it)<<endl;
}
}
return 0;
}
R7-5 月饼 (25 分)
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
struct node{
double d;
double w;
double p;
}dp[N];
bool cmp(node x,node y){
return x.d>y.d;
}
int main(){
int n,d;
cin>>n>>d;
for(int i=1;i<=n;i++) cin>>dp[i].w;
for(int i=1;i<=n;i++){
cin>>dp[i].p;
dp[i].d=dp[i].p*1.0/dp[i].w;
}
sort(dp+1,dp+1+n,cmp);
double ans=0;
for(int i=1;i<=n;i++){
if(!d) break;
if(dp[i].w<=d){
d-=dp[i].w;
ans+=dp[i].p;
}
else{
ans+=dp[i].d*d;
d=0;
break;
}
}
printf("%.2f\n",ans);
return 0;
}
R7-6 单身狗 (25 分)
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
set<int>st;
set<int>sp;
int mp[N];
int dp[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int x,y;
cin>>x>>y;
mp[x]=y;
mp[y]=x;
}
int q;
cin>>q;
for(int i=1;i<=q;i++) cin>>dp[i],sp.insert(dp[i]);
for(int i=1;i<=q;i++){
if(!sp.count(mp[dp[i]])) st.insert(dp[i]);
}
cout<<(int)st.size()<<endl;
set<int>::iterator it;
for(it=st.begin();it!=st.end();it++){
if(it==st.begin()) printf("%05d",(*it));
else printf(" %05d",(*it));
}
return 0;
}
R7-7 插入排序还是堆排序 (25 分)
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e3 + 10;
using namespace std;
int n;
int dp[N];
int mp[N];
int vp[N];
bool inin;
void judge_insert(int *a,int *b){
bool flag=0;
// cout<<n<<endl;
for(int i=2;i<=n;i++){
// cout<<i<<endl;
sort(a,a+i);
if(flag){
inin=1;
puts("Insertion Sort");
cout<<a[0];
for(int j=1;j<n;j++) cout<<" "<<a[j];
cout<<endl;
return ;
}
// cout<<a[0];
// for(int j=1;j<n;j++) cout<<" "<<a[j];
// cout<<endl;
for(int j=0;j<n;j++){
if(a[j]!=b[j]){
flag=1;
break;
}
}
if(flag) flag=0;
else flag=1;
}
// cout<<"**"<<endl;
}
void judge(int *b,int l,int r){
int i=l;
int j=i*2;
while(j<=r){
// cout<<b[0];
// for(int i=1;i<n;i++) cout<<" "<<b[i];
// cout<<endl;
if(j+1<=r&&b[j]<b[j+1]) j++;
if(b[j]>b[i]){
swap(b[i],b[j]);
// cout<<b[i]<<" "<<b[j]<<endl;
// cout<<"i j::"<<i<<" "<<j<<endl;
i=j;
j=i*2;
}
else break;
}
}
void judge_heap(int *b){
for(int i=n;i>=1;i--) b[i]=b[i-1];
if(inin) return ;
// int c[N];
puts("Heap Sort");
int pos=n;
while(pos>=2&&b[pos]>b[pos-1]) pos--;
swap(b[1],b[pos]);
judge(b,1,pos-1);
// judge(b,0,pos-2);
// judge(b,0,pos-2);
// judge(b,0,pos-2);
// swap(b[0],b[1]);
// swap(b[2],b[5]);
cout<<b[1];
for(int i=2;i<=n;i++) cout<<" "<<b[i];
cout<<endl;
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>dp[i];
vp[i]=dp[i];
}
// for(auto &i:dp) cout<<dp[i]<<" ";
// cout<<endl;
for(int i=0;i<n;i++) cin>>mp[i];
judge_insert(dp,mp);
judge_heap(mp);
return 0;
}
R7-8 插入排序还是归并排序 (25 分)
答案
#include<bits/stdc++.h>
#define ll long long
const int N = 1e6 + 10;
using namespace std;
int n;
int dp[N];
int mp[N];
int vp[N];
void judge_insert(int *a,int *b){
bool flag=0;
// cout<<n<<endl;
for(int i=2;i<=n;i++){
// cout<<i<<endl;
sort(a,a+i);
if(flag){
puts("Insertion Sort");
cout<<a[0];
for(int j=1;j<n;j++) cout<<" "<<a[j];
cout<<endl;
return ;
}
// cout<<a[0];
// for(int j=1;j<n;j++) cout<<" "<<a[j];
// cout<<endl;
for(int j=0;j<n;j++){
if(a[j]!=b[j]){
flag=1;
break;
}
}
if(flag) flag=0;
else flag=1;
}
// cout<<"**"<<endl;
}
void judge_merge(int *a,int *b){
bool flag=0;
for(int i=2;;i*=2){
for(int j=0;j<n;j+=i)
if(i+j<n) sort(a+j,a+j+i);
else sort(a+j,a+n);
if(flag){
puts("Merge Sort");
cout<<a[0];
for(int j=1;j<n;j++) cout<<" "<<a[j];
cout<<endl;
return ;
}
for(int j=0;j<n;j++){
if(a[j]!=b[j]){
flag=1;
break;
}
}
if(flag) flag=0;
else flag=1;
if(i>n) break;
}
}
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>dp[i];
vp[i]=dp[i];
}
// for(auto &i:dp) cout<<dp[i]<<" ";
// cout<<endl;
for(int i=0;i<n;i++) cin>>mp[i];
judge_insert(dp,mp);
judge_merge(vp,mp);
return 0;
}