Codeforces Round 1048 (Div. 2)与Codeforces Round 1049 (Div. 2)补题
文章目录
- 一、Codeforces Round 1048 (Div. 2)
- A. Maple and Multiplication
- B. Cake Collection
- C. Cake Assignment
- 二、Codeforces Round 1049 (Div. 2)
- A. Shift Sort
- B. Another Divisibility Problem
- 总结
一、Codeforces Round 1048 (Div. 2)
A. Maple and Multiplication
这题题意很明显,就是求最小操作数得到a=b,其实只需要判断两个数是否存在倍数关系
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pii pair<int,int>
#define fi first
#define se second
#define int long long
#define endl '\n'
#define lowbit(x) (x&(-x))
signed main()
{int t;cin>>t;while(t--){int a,b;cin>>a>>b;if(a==b)cout<<"0"<<endl;//相等不需要变化else{if(a%b==0||b%a==0)//存在倍数关系cout<<"1"<<endl;elsecout<<"2"<<endl;//不存在就将两个数转化为最小公倍数,只需2步}}return 0;}
B. Cake Collection
这题就是通过规定次数求最大蛋糕数
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pii pair<int,int>
#define fi first
#define se second
#define int long long
#define endl '\n'
#define lowbit(x) (x&(-x))
const int N=1e5+6;
int a[N];
signed main()
{int t;cin>>t;while(t--){int n,m;cin>>n>>m;for(int i=1;i<=n;i++) {cin>>a[i];} sort(a+1,a+n+1);//排序方便求最大int sum=0;if(n>m)//由于操作次数小于烤箱的数量,所以只需要从小到大依次拿就行了,因为烤箱内蛋糕数量会一直增加,所以为了求最大让最大的数走最多次,剩下的数一样,这样才能得到最大蛋糕数{int x=1;for(int i=n-m+1;i<=n;i++){sum+=x*a[i];x++;}cout<<sum<<endl;}else//操作次数大于烤箱的数量,但是也要保证让最大的数走最多次,所以多的几次一直取最小的那个数,让后面大的数更大,这样才能得到最大蛋糕数{if(n==1)cout<<m*a[1]<<endl;else{int sum=(m-n+1)*a[1];for(int i=n;i>=2;i--){sum+=m*a[i];m--;}cout<<sum<<endl;}}}return 0;
}
C. Cake Assignment
这到题就是通过1和2两个操作,求最小操作数得到目标值
这道题可以反着操作,从目标值到给定值,其中我们可以发现如果a的值小于总数/2的话,那么其肯定是经过1操作(a/2)得到,反之经过操作2(a+b/2)得到
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pii pair<int,int>
#define fi first
#define se second
#define int long long
#define endl '\n'
#define lowbit(x) (x&(-x))
signed main()
{int t;cin>>t;while(t--){int k,x;cin>>k>>x;int y=pow(2,k);int z=y*2;int a=x;int b=z-x;int sum=0;if(x==y){cout<<0<<endl;cout<<endl;}else{vector<int>ve;while(a!=y&&b!=y){if(a<y){b-=a;a*=2;sum++;ve.push_back(1);}else{a-=b;b*=2;sum++;ve.push_back(2);}}cout<<sum<<endl;for(int i=ve.size()-1;i>=0;i--)cout<<ve[i]<<" ";cout<<endl;}}return 0;}
二、Codeforces Round 1049 (Div. 2)
A. Shift Sort
这题注重的不是怎么移而是移动后的位置,由题知所有的1都在0后面所以只需要关注排序后1的位置是有几个0,有几个0就说明要走几步
#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
#define pii pair<int,int>
#define fi first
#define se second
#define int long long
#define endl '\n'
#define lowbit(x) (x&(-x))
int a[106];
signed main()
{int t;cin>>t;while(t--){int n;cin>>n;string s;cin>>s;int sum=0;for(int i=0;i<n;i++){a[i+1]=s[i]-'0';if(a[i+1]==1)sum++;}int sum1=0;for(int i=n-sum+1;i<=n;i++){if(a[i]==0)sum1++;}cout<<sum1<<endl;}return 0;}
B. Another Divisibility Problem
这题怎么说呢,没有想到
由题可推 n=len(y)
(10^n) x+y能够整除x+y
只要是10的n次方,其除以3肯定都是1
所以令y=2*x
(10^n) x+2x|x+2x
即 10^n+2|3,此时对于任意的n都存在整除
所以y=2x就行
总结
有些题的方法很巧妙,想不出来,还是要多学习学习