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 }
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 }
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 }

浙公网安备 33010602011771号