训练赛补题
思考:1)求最大公约数的时候除法比减法要快,以后能用除法去处理大数就不要用剑法去处理大数
题意:其实就是给定了n个数,问间隔最少d,那么这样最少是几组,并且哪个是哪一组的
思路:就是直接进行比较,先进行按照数值进行从小到大排序,如果队首和此时的值进行比较大于d那就更新,如果小于等于d,那就天数+1,进行插入(因为队首才是最小的分钟,直接贪心即可)
代码:

1 #include <bits/stdc++.h> 2 using namespace std; 3 const int maxn=2e5+5; 4 int ans[maxn]; 5 struct node{ 6 int id,val; 7 }a[maxn]; 8 bool cmp(const node &x,const node &y){ 9 return x.val<y.val; 10 } 11 bool operator<(const node &x,const node &y){ 12 return x.val>y.val; 13 } 14 priority_queue <node> q; 15 int main(){ 16 int n,m,d; 17 scanf("%d%d%d",&n,&m,&d); 18 for(int i=1;i<=n;i++) 19 { 20 scanf("%d",&a[i].val); 21 a[i].id=i; 22 } 23 sort(a+1,a+n+1,cmp); 24 ans[a[1].id]=1; 25 node x; 26 x.id=1,x.val=a[1].val; 27 q.push(x); 28 int res=1; 29 for(int i=2;i<=n;i++) 30 { 31 node y=q.top(); 32 if(a[i].val-y.val<=d) 33 { 34 ans[a[i].id]=q.size()+1; 35 node e; 36 e.id=q.size()+1,e.val=a[i].val; 37 q.push(e); 38 }else{ 39 node e; 40 e.id=y.id,e.val=a[i].val; 41 q.pop(); 42 q.push(e); 43 ans[a[i].id]=y.id; 44 } 45 res=max(res,ans[a[i].id]); 46 } 47 printf("%d\n",res); 48 for(int i=1;i<=n;i++) 49 { 50 printf("%d ",ans[i]); 51 } 52 return 0; 53 }
感想:过了个年落下的东西太多,下学期最起码还得付出两倍的时间进行追赶,最近因为各种杂事儿没有来的及刷题,今天再刷div2的题时,发现不刷题不仅不会原地踏步,应该是加速后退,以后还是多刷题多刷题