2021.3.10
A - Kids Seating
题意:座位从1到4n编号,为n个学生选座且满足任意两个学生gcd(a,b)!=1且a与b互质
题解:如果要使这n个数互质且最大公约数不为1,则这n个数可为这样连续的n个数,即 2(k+1),2(k+2)……,2(k+n).,若要互质则k+1>(k+n)/2且2(k+n)<=4n得n-2<k<=n,带入符合条件的k可得符合条件的座位号
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> using namespace std; int main(){ int t; cin>>t; while(t--){ int n; cin>>n; for(int i=2*n;i<4*n;i+=2){ cout<<i<<" "; } cout<<endl; } return 0; }
B - Saving the City
题意:给一个由01组成的字符串。将连续的1变成0花费a,0变成1花费b;求字符串全变成0的最小花费
题解:第一个连续的1的片段花费a,再找后面夹在1中间的0的数量cnt,判断cnt*b与a的大小加上小的那个
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<cmath> #include<algorithm> using namespace std; typedef long long ll; int main(){ int t,a,b; cin>>t; string s; ll sum=0; int flag=0,cnt=0; while(t--){ sum=0,flag=0,cnt=0; cin>>a>>b; cin>>s; for(int i=0;i<s.length();i++){ if(s[i]=='1'&&!flag){ flag=1; sum+=a; }else if(flag&&s[i]=='0'){ cnt++; }else if(flag&&s[i-1]=='0'){ sum+=min(a,cnt*b); cnt=0; } } cout<<sum<<endl; } return 0; }