Gym - 101652 部分题解

题目链接1  题目链接2

又是一场和库里布莱恩特的菜鸡互啄,这次还是三星gym,还是两个人一起做,比上次还惨,才6个题。

这场的题感觉很简单,就是有点坑,第二题是多组输入但题里并没有说,骰子那题也是大水题,就是题意难懂,机器人那题也是题目简单,但题意难懂。分块除法,新知识点。BR那题,转化,然后求最大子段和,没想到。还有就是二分,二分真的太好用了。

Gym - 101652Z  Forbidden Zero

最简单的一道题,意外拿到了一血。while循环找下一个数,知道找到一个不各个位中不包含0的数,输出即可。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi=acos(-1.0);
using namespace std;
char s[110];
bool ok(int x)
{
    stringstream a;
    a<<x;
    a>>s;
    rep(i,0,strlen(s))
        if(s[i]=='0')
            return false;
        return true;
}
int main()
{
    int n;
    cin>>n;
    while(n++)
    {
        if(ok(n))
            {cout<<n;return 0;}
    }
    return 0;
}

Gym - 101652N Odd Palindrome

这道题有点迷,感觉题里的描述和AC的代码不符合。直接判断字符串长度就行就AC了......可能是数据太水了吧,谁知道呢

#include <bits/stdc++.h>

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;

#define LL long long
#define INF 0x3f3f3f3f
#define mes(a, val) memset(a, val, sizeof a)
#define mec(b, a) memcpy(b, a, sizeof a)

string s;

int main()
{
    cin>>s;
    int n = s.length();
    if(n & 1)cout<<"Odd."<<endl;
    else cout<<"Or not."<<endl;

    return 0;
}

Gym 101652O Latin Squares

这题本来本简单,就是有一个大bug,就是这道题是多组输入,但是题目中并没有说......

用set或者用数组模拟都行,如果不是Latin Squares的话就输出No,如果是“Latin Squares的话,再判断第一行和第一列是不是升序,如果都是升序的话输出Reduced,否则输出Not Reduced。

贴一下库里布莱恩特的代码(代码风格不忍直视......一条语句还加括号)

#include <bits/stdc++.h>

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;

#define LL long long
#define INF 0x3f3f3f3f
#define mes(a, val) memset(a, val, sizeof a)
#define mec(b, a) memcpy(b, a, sizeof a)

const int maxn = 50;
int a[maxn][maxn];
int n;
int visr[maxn], visc[maxn];
set<int>s;
int main()
{
    char ch;
    while(scanf("%d",&n)!=EOF){

    for(int i = 1; i <= n; i ++){
        for(int j = 1; j <= n; j ++){
            cin>>ch;
            if(ch >= '0' && ch <= '9'){
                a[i][j] = ch-'0';
            }
            else if(ch >= 'A' && ch <= 'Z'){
                a[i][j] = ch-'A'+10;
            }
        }
    }

    int flag = 0;

    for(int i = 1; i <= n; i ++){
        s.clear();
        for(int j = 1; j <= n; j ++){
            s.insert(a[i][j]);
        }
        if(s.size() < n){
//            cout<<s.size()<<endl;
            flag = 1;break;
        }
    }


    for(int j = 1; j <= n; j ++){
        s.clear();
        for(int i = 1; i <= n; i ++){
            s.insert(a[i][j]);
        }
        if(s.size() < n){
//            cout<<s.size()<<endl;
            flag = 1;break;
        }

    }
    if(flag == 1){
        cout<<"No"<<endl;
    }
    else {
        flag = 0;
        for(int j = 1; j <= n; j ++){
            if(a[1][j] != j-1){
                flag = 1;break;
            }
        }
        for(int i = 1; i <= n; i ++){
            if(a[i][1] != i-1){
                flag = 1;break;
            }
        }
        if(flag == 1){
            cout<<"Not Reduced"<<endl;
        }
        else {
            cout<<"Reduced"<<endl;
        }
    }
    }
    return 0;
}

Gym - 101652Y  Delayed Work

要找人装修房子,先要给每个人都支付x工资(与工作时间无关),这项工作一个人做的话需要k天,m个人就需要k/m天,在这k/m天中每人每天要支付p工资。给出k,p,x,问完成这项工作最少需要多少钱。假设找m个人完成这项工作,则需要支付费用m*x+k/m*p,然后由均值不等值的m*x+k/m*p>=2*sqrt(m*x*(k/m*p)),当且仅当m满足m*x==k/m*p时等号成立。所以这个题就是先算m,m必须取整是(因为m是人数),然后为了保险起见,让m+1,m-1都是一遍,看哪个费用少,还有一点,就是k/m可以不是整数,也就是说天数可以不是整数(我也是看了样例才知道的)。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
int m1,m2,m3;
double mm;
int main() {
    int k, p, x;
    cin >> k >> p >> x;
    mm=sqrt((k*p)*1.0/(x*1.0));
    m1=max(int(mm),1);
    m2=max(m1+1,1);
    m3=max(m1-1,1);
    double ans=0;
    double d1=(k*1.0/(m1*1.0));
    double d2=(k*1.0/(m2*1.0));
    double d3=(k*1.0/(m3*1.0));
    ans=min(min(m1*x+d1*p,m2*x+d2*p),m3*x+d3*p);
    printf("%.3f",ans);
    return 0;
}

 Gym - 101652X  Star Arrangements

给出n表示星号的数目,然后让你写出所有的排列方案。每个排列方案必须满足三个条件:1、每隔一排都有相同数量的星星。2、相邻的排之间的星星数目之差不能超过1。3、第一排不能比第二排少。所以while循环一下一个一个试就行了。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;

int main()
{
    int s;
    int a,b;
    cin>>s;
    cout<<s<<":"<<endl;
    a=2;
    while(a<=s/2+1)
    {
        b=a-1;
        if(s%(a+b)==0||s%(a+b)==a)
            cout<<a<<","<<b<<endl;
        b=a;
        if(s%(a+b)==0||s%(a+b)==a)
            cout<<a<<","<<b<<endl;
        a++;
    }
    return 0;
}

Gym - 101652U Unloaded Die

哇,实际上这也是个大水题,题读懂了真的超简单。

给出6个数,表示骰子的6个面分别表示每个面朝上的概率,然后你可以改变一个面的值(可以是不是整数,甚至可以是负数),使得抛这个骰子,骰子的值的期望值是3.5,问改变之后的值和变之前的值的差的绝对值最小数多少。所以for循环一个一个试一下就行了......

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
double a[7];
int main()
{
    rep(i,1,6)
        cin>>a[i];
    double sum=0;
    rep(i,1,6)
        sum+=(i*a[i]);
    double ans=inf;
    if(sum==3.5)
        {cout<<"0.000";return 0;}
        rep(i,1,6)
            ans=min(ans,abs(3.5-sum)/a[i]);
    printf("%.3f",ans);
    return 0;
}

Gym - 101652Q  Halfway

二分,还是二分。题意我懒得说了......

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi=acos(-1.0);
using namespace std;

int main()
{
    ll n;
    cin>>n;
    ll l=1,r=n;
    ll k=((n-1)*n/2+1)/2;
    while(l<=r)
    {
        ll mid=(l+r)/2;
        ll cnt=0;
        cnt=(2*n-1-mid)*mid/2;
        if(cnt-(n-mid)<k&&cnt>=k)
            {cout<<mid;return 0;}
        if(cnt<k)
            l=mid+1;
        else
            r=mid-1;
    }
    return 0;
}

 Gym 101652R  Straight Shot

哎,题意难懂,读懂了挺简单的,简直就是高一物理题,但还是有一个地方没想起来,vy不会求,哎。

看这个:https://blog.csdn.net/Healer66/article/details/82423757 一看就懂。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
double l[110],r[110],v[110];
int main()
{
    int n;
    double X,V;
    cin>>n>>X>>V;
    rep(i,1,n)
        cin>>l[i]>>r[i]>>v[i];
    double vy=0;
    rep(i,1,n)
        vy+=(r[i]-l[i])*v[i];
    vy/=X;
    if(abs(vy)>=abs(V))
        cout<<"Too hard";
    else
    {
        double t=X/(sqrt(V*V-vy*vy));
        if(t>=2*X/V)
            cout<<"Too hard";
        else
            printf("%.3f",t);
    }
    return 0;
}

 Gym 101652S Purple Rain

转化一下,求最大字段和,哎,我当时想到转化了,但我以为求最大字段和要n方复杂度,所以就没搞,哎,太菜了。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi=acos(-1.0);
using namespace std;
char ss[100010];
char s[100010];
int a[100010];
int st1,ed1,st2,ed2;
int main()
{
    scanf("%s",ss);
    int n=strlen(ss);
    rep(i,0,n-1)
        s[i+1]=ss[i];
    rep(i,1,n)
    {
        if(s[i]=='B')
            a[i]=1;
        else
            a[i]=-1;
    }

    int tmp1=1,sum1=0;
    int max1=-inf;
    rep(i,1,n)
    {
        sum1+=a[i];
        if(sum1>max1)
        {
            max1=sum1;
            st1=tmp1;
            ed1=i;
        }
        if(sum1<0)
        {
            tmp1=i+1;
            sum1=0;
        }
    }
    rep(i,1,n)
    {
        if(s[i]=='B')
            a[i]=-1;
        else
            a[i]=1;
    }
    int tmp2=1,sum2=0;
    int max2=-inf;
    rep(i,1,n)
    {
        sum2+=a[i];
        if(sum2>max2)
        {
            max2=sum2;
            st2=tmp2;
            ed2=i;
        }
        if(sum2<0)
        {
            tmp2=i+1;
            sum2=0;
        }
    }
    if(max1>max2)
        {cout<<st1<<" "<<ed1<<endl;return 0;}
    if(max2>max1)
        {cout<<st2<<" "<<ed2<<endl;return 0;}
    if(st1<st2)
        {cout<<st1<<" "<<ed1<<endl;return 0;}
    if(st2<st1)
        {cout<<st2<<" "<<ed2<<endl;return 0;}
    if(ed1<ed2)
        {cout<<st1<<" "<<ed1<<endl;return 0;}
    cout<<st2<<" "<<ed2<<endl;
    return 0;
}

Gym 101652P Fear Factoring

题意好懂,不说了。这个用到了分块除法,长知识了。

有篇博客写的不错,可以看一下。https://blog.csdn.net/qq_39599067/article/details/81807580

不过这题有个坑点,就是结果要用unsigned long long来存,因为最终结果可能爆long long。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
ull getsum(ll n)
{
    ull ret=0;
    ull l=1,r=1;
    for(l=1;r<=n&&l<=n;l=r+1)
    {
        r=n/(n/l);
        ret+=(n/l)*(r+l)*(r-l+1)/2;
    }
    return ret;
}
int main()
{
    ll a,b;
    cin>>a>>b;
    cout<<getsum(b)-getsum(a-1);
    return 0;
}

太菜了,还是得多刷题啊!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值