训练赛补题

CodeForces - 1041B 

思考:1)求最大公约数的时候除法比减法要快,以后能用除法去处理大数就不要用剑法去处理大数

CodeForces - 1041C 

题意:其实就是给定了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 }
View Code

 

感想:过了个年落下的东西太多,下学期最起码还得付出两倍的时间进行追赶,最近因为各种杂事儿没有来的及刷题,今天再刷div2的题时,发现不刷题不仅不会原地踏步,应该是加速后退,以后还是多刷题多刷题

posted @ 2021-02-20 17:53  bonel  阅读(46)  评论(0)    收藏  举报