Codeforces Round #694 (Div. 2)

 

 A. Strange Partition
题意:就是求最小和最大的bi/x向上取整的和。
思路:见题解:https://blog.csdn.net/qq_45900709/article/details/112341661
当时没想到的:就是不是说能够代替,不应该是平均以后再向上取整吗,尤其是等式的后一部分
代码:
 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<cstdio>
 5 #include<cmath>
 6 using namespace std;
 7 const int maxx=1e5+10;
 8 int main(){
 9     int t;
10     scanf("%d",&t);
11     while(t--){
12         int n,x;
13         scanf("%d %d",&n,&x);
14         int a[maxx]={0};
15         long long int sum=0,y=0,summ=0;
16         for(int i=0;i<n;i++){
17             scanf("%d",&a[i]);
18             sum+=(a[i]/x);
19             if(a[i]%x!=0){
20                 sum++;
21             }
22             summ+=a[i];
23         }
24         long long int mi=0,ma=0;
25         if(summ%x!=0){
26             mi++;
27         }
28         mi+=summ/x;
29         printf("%lld %lld\n",mi,sum);
30     }
31 }
View Code

B. Strange List

题意:设当前数为q,如果q能被x整除,在序列末端插入x个q/x,q移到下一位元素重复以上操作,如果不能就结束操作。求序列最终的和。

思路:其实这个是有规律的,插入x个q/x就是加q,只要q能被x整除就加q,一直到出现一个不能被x整除的数为止。也就是说,即使加入了x个q/x,那么和加q没什么区别

当时没想到的:1)本想着用数组,然后手写动态的数组,进行n++,然后存储空间太小,爆掉了;2)然后就想着要不要用队列,然后发现还是爆掉了;3)这种会RE或者会TLE的题目一定有简单的解法,一个是进行找找规律

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 const long long int maxx=1e7;
 9 long long int a[maxx];
10 long long int b[maxx];
11 int main(){
12     long long int t;
13     scanf("%lld",&t);
14     while(t--){
15         long long int n,x;
16         scanf("%lld %lld",&n,&x);
17         long long int sum=0;
18         queue<int> s;
19         for(long long int i=0;i<n;i++){
20             scanf("%lld",&a[i]);
21             b[i]=a[i];
22             sum+=a[i];
23         }
24         int flag=0;
25         while(!flag){
26  
27             for(int i=0;i<n;i++){
28                 if(b[i]%x){
29                     flag=1;
30                     break;
31                 }
32                 sum+=a[i];
33                 b[i]/=x;
34             }
35  
36         }
37         printf("%lld\n",sum);
38     }
39 }
View Code

C. Strange Birthday Party

题意:p有n位朋友,每位朋友有一个数ki。商店有m份礼物,第j份礼物价值cj美元,每份礼物只能买一次。当j<=ki时,p要么给第i位朋友价值为cj的礼物,要么直接给cki美元。问最小花费。

思路:注意c序列升序。对k序列降序处理,k值大的先选,避免较小的k值拿走较小的c值,最小值从c1开始,每次和cki比较取较小值。因为一个是第二个数组肯定是升序,这样的话,为了增大c中对应的cki和ci之间的差别,就应该倒置,因为c数组一定是从小到大

代码:

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<queue>
 7 using namespace std;
 8 const long long int maxx=3e5+10;
 9 int a[maxx];
10 int b[maxx];
11 int main(){
12     long long int t;
13     scanf("%lld",&t);
14     while(t--){
15         int n,m;
16         scanf("%d %d",&n,&m);
17         for(int i=0;i<n;i++){
18             scanf("%d",&a[i]);
19         }
20         for(int i=0;i<m;i++){
21             scanf("%d",&b[i]);
22         }
23         int p=0;
24         sort(a,a+n);
25         int s=b[p++];
26         long long int sum=0;
27         for(int i=n-1;i>=0;i--){
28             if(b[a[i]-1]>s){
29                 sum+=s;
30                 s=b[p++];
31  
32             }else{
33                 sum+=b[a[i]-1];
34  
35             }
36  
37         }
38  
39         printf("%lld\n",sum);
40     }
41 }
View Code

 

 

 

posted @ 2021-01-24 17:06  bonel  阅读(41)  评论(0)    收藏  举报