打得还不错的一场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 }
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 }
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 }
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 }