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

 

posted @ 2021-03-16 18:02  Endeavo_r  阅读(52)  评论(0)    收藏  举报