Codeforces #377 Div2

打得还不错的一场CF,题目质量也很高,今后还要继续努力

A题:

题意:给定一个数k,让其乘一个最小的数,使乘得以后的数要不被10整除,要不减去r以后被10整除,求这个最小的数

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 int r,k;
15 int main()
16 {
17     while(cin>>r>>k)
18     {
19         int pos;
20         for(int i=1;i<=10;i++){
21             int t=i*r;
22             if((t%10==0)||((t-k)%10==0))
23             {
24                 pos=i; break;
25             }
26         }
27         cout<<pos<<endl;
28     }
29     return 0;
30 }
View Code

B题:

题意:给定n个数和一个数k,求最少修改使任意相邻的两个数的和大于等于k

分析:对于任意两个数和大于等于k的不做修改,对于小于k的,修改后一个数即可,使其加上k-(二者的和)

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 const int maxn=550;
15 int a[maxn],b[maxn];
16 int n,k;
17 int main()
18 {
19     while(cin>>n>>k)
20     {
21         memset(a,0,sizeof(a));
22         memset(b,0,sizeof(b));
23         for(int i=1;i<=n;i++)
24             cin>>a[i];
25         int cnt=0;
26         for(int i=1;i<=n-1;i++){
27             if(a[i]+a[i+1]>=k){
28                 b[i]=a[i];
29             }else{
30                 b[i]=a[i];
31                 int t=k-a[i]-a[i+1];
32                 cnt+=t;
33                 a[i+1]+=t;
34             }
35         }
36         b[n]=a[n];
37         cout<<cnt<<endl;
38         for(int i=1;i<=n-1;i++)
39             printf("%d ",b[i]);
40         printf("%d
",b[n]);
41     }
42     return 0;
43 }
View Code

C题:

题意:给定吃的三餐的次数,确定最少有多少餐没吃

分析:如果三餐相等就是0,否则就是根据最多的那一餐来决定

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <string>
 5 #include <vector>
 6 #include <algorithm>
 7 #include <set>
 8 #include <map>
 9 #include <bitset>
10 #include <cmath>
11 #include <queue>
12 #include <stack>
13 using namespace std;
14 long long MAX(long long a,long long b,long long c)
15 {
16     long long d=max(a,b);
17     long long e=max(c,d);
18     return e;
19 }
20 long long b,d,s;
21 int main()
22 {
23     while(cin>>b>>d>>s)
24     {
25         long long h=MAX(b,d,s);
26         long long cnt;
27         if(b==d&&d==s){
28             cout<<"0"<<endl;
29             continue;
30         }
31         if(h==b){
32             cnt=max((long long)0,(b-1-d))+max((b-1-s),(long long)0);
33         }else if(h==d){
34             cnt=max((long long)0,(d-1-b))+max((long long)0,(d-1-s));
35         }else{
36             cnt=max((long long)0,(s-1-b))+max((long long)0,(s-1-d));
37         }
38         cout<<cnt<<endl;
39     }
40     return 0;
41 }
View Code

D题:

暂时还没做

E题:

题意:有n台电脑,和m个插座,如果二者的power相等,就可以进行连接,插座可以加适配器,没加一次适配器以后power变为,求最多可以适配多少台电脑,在此基础上最少需要的适配器数量。同时输出每一个插座的适配器数量,以及每一台电脑和哪个插座适配

分析:我们需要把电脑按照power从大到小进行排序,然后用优先队列来维护插座,如果电力值大于电脑,变为,然后在入队,如果等于,直接适配

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <string>
  5 #include <vector>
  6 #include <algorithm>
  7 #include <set>
  8 #include <map>
  9 #include <bitset>
 10 #include <cmath>
 11 #include <queue>
 12 #include <stack>
 13 using namespace std;
 14 const int maxn=200020;
 15 const int INF=1<<30;
 16 int n,m;
 17 typedef struct T{
 18     int num,id;
 19 }T;
 20  T p[maxn];
 21 int s[maxn]; //电脑和插座需要的power
 22 typedef struct P{
 23     int x,num,id;
 24     friend bool operator<(P a,P b)
 25     {
 26         if(a.x==b.x)
 27             return a.num>b.num;
 28         return a.x<b.x;  //大顶堆
 29     }
 30 }P;
 31 typedef struct Point{
 32     int cnt,id;
 33 }Point;
 34 Point vis[maxn];
 35 int vis1[maxn];
 36 bool cmp(T  a,T b)
 37 {
 38     return a.num>b.num;
 39 }
 40 int a[maxn];
 41 int b[maxn];
 42 int main()
 43 {
 44     while(cin>>n>>m)
 45     {
 46         priority_queue<P> que;
 47         for(int i=1;i<=maxn;i++){
 48             vis[i].cnt=0,vis[i].id=0;
 49         }
 50         for(int i=1;i<=n;i++){
 51             scanf("%d",&p[i].num);
 52             p[i].id=i;
 53         }
 54         for(int i=1;i<=m;i++)
 55         {
 56             scanf("%d",&s[i]);
 57             P e;
 58             e.x=s[i];
 59             e.num=0;
 60             e.id=i;
 61             que.push(e);
 62         }
 63         memset(vis1,0,sizeof(vis1));
 64         sort(p+1,p+1+n,cmp);
 65         for(int i=1;i<=n;i++){
 66             int t,q,h;
 67             while(que.top().x>p[i].num&&!que.empty()){
 68                 P s=que.top();
 69                 que.pop();
 70                 t=s.x,q=s.num,h=s.id;
 71                 t=(t+1)/2;
 72                 q++;
 73                 s.x=t,s.num=q,s.id=h;
 74                 que.push(s);
 75             }
 76             if(que.empty())  break;
 77             if(que.top().x==p[i].num){
 78                 vis[i].cnt=que.top().num;
 79                 vis[i].id=que.top().id;
 80                 vis1[i]=1;
 81                 que.pop();
 82             }else{
 83                 continue;
 84             }
 85         }
 86         int c=0,u=0;
 87         for(int i=1;i<=n;i++){
 88             if(vis1[i]){
 89                 ++c;
 90                 u+=vis[i].cnt;
 91             }
 92         }
 93         printf("%d %d
",c,u);
 94         memset(a,0,sizeof(a));
 95         for(int i=1;i<=n;i++){
 96                 a[vis[i].id]=vis[i].cnt;
 97         }
 98         for(int i=1;i<=m;i++){
 99             printf("%d ",a[i]);
100         }
101         printf("
");
102         memset(b,0,sizeof(b));
103         for(int i=1;i<=n;i++){
104             b[p[i].id]=vis[i].id;
105         }
106         for(int i=1;i<=n;i++)
107             printf("%d ",b[i]);
108         cout<<endl;
109     }
110     return 0;
111 }
View Code
原文地址:https://www.cnblogs.com/wolf940509/p/5992593.html