【十一月】第五次课堂练习
p2676
#include<stdio.h> using namespace std; int n; int num[10001]; int m; int ans; int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ int h; scanf("%d",&h); num[h]++; } ans = 0; for(int i=10000;i>=1;i--){ if(num[i]){ while(num[i]){ m-=i; ans++; if(m<=0) { printf("%d",ans); return 0; } num[i]--; } } } }
p1177
#include<iostream> using namespace std; int n,a[1000001]; void qsort(int l,int r)//应用二分思想 { int mid=a[(l+r)/2];//中间数 int i=l,j=r; do{ while(a[i]<mid) i++;//查找左半部分比中间数大的数 while(a[j]>mid) j--;//查找右半部分比中间数小的数 if(i<=j)//如果有一组不满足排序条件(左小右大)的数 { swap(a[i],a[j]);//交换 i++; j--; } }while(i<=j);//这里注意要有= if(l<j) qsort(l,j);//递归搜索左半部分 if(i<r) qsort(i,r);//递归搜索右半部分 } int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; qsort(1,n); for(int i=1;i<=n;i++) cout<<a[i]<<" "; }
p1059
#include<iostream> using namespace std; int main(){ int n,x; cin>>n; int sum(0),bus[1002]={0}; for(int i=1;i<=n;i++){ cin>>x; if(bus[x]) //如果这个数已经出现过了,那么跳过 continue; bus[x]++; //如果没有出现,把数据放在桶里,并让总数居++ sum++; } cout<<sum<<endl; for(int i=1;i<=1000;i++) if(bus[i]) cout<<i<<' '; cout<<endl; return 0; }
p1923
#include<iostream> using namespace std; int main(){ int n,x; cin>>n; int sum(0),bus[1002]={0}; for(int i=1;i<=n;i++){ cin>>x; if(bus[x]) //如果这个数已经出现过了,那么跳过 continue; bus[x]++; //如果没有出现,把数据放在桶里,并让总数居++ sum++; } cout<<sum<<endl; for(int i=1;i<=1000;i++) if(bus[i]) cout<<i<<' '; cout<<endl; return 0; }
p2249
#include<cstdio> using namespace std; int n,m,q,a[1000005]; int find(int x) //二分查找 { int l=1,r=n; while (l<r) { int mid=l+(r-l)/2; if (a[mid]>=x) r=mid; else l=mid+1; } if (a[l]==x) return l; //找都了就输出他的位置 else return -1; // 没找到输出-1 } int main() { scanf("%d %d",&n,&m); //读入 for (int i=1 ; i<=n ; i++) scanf("%d",&a[i]); //还是读入 for (int i=1 ; i<=m ; i++) { scanf("%d",&q); int ans=find(q); //看看查找的结果 printf("%d ",ans); //输出 } return 0; }
p1678
#include<stdio.h> #include<algorithm> using namespace std; int n,m; int a[1000005]; long long ans; int main(){ scanf("%d%d",&m,&n); for(int i=1;i<=m;i++) scanf("%d",&a[i]); sort(a+1,a+1+m); ans = 0; for(int i=1;i<=n;i++){ int g; scanf("%d",&g); int l=1,r=m; int gg = 1000000; while(l<=r){ int mid = (l+r)/2; gg = min(abs(a[mid]-g),gg); if(a[mid] == g) break; else if(a[mid]<g) l=mid+1; else if(a[mid]>g) r=mid-1; } ans+=gg; } printf("%lld",ans); }
p2240
#include <bits/stdc++.h> using namespace std; long long a[100001],t=0,k,m,n; int js(int x) { register int i; t=0; for(i=1;i<=n;i++) { t+=a[i]/x; if(t>=k) return 1; } return 0; } int main() { long long s,l=0,r=0x7fffffff; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) scanf("%d",&a[i]); while(l+1<r) { m=l+(r-l)/2; if(js(m)==1) l=m; else r=m; } printf("%d",l); return 0; }