Gym - 101652 部分题解

题目链接1  题目链接2

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

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

Gym - 101652Z  Forbidden Zero

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

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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)<>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<

Gym - 101652N Odd Palindrome

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

#include 

#include 
#include 
#include 
#include 
#include 
#include 
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."<

Gym 101652O Latin Squares

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

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

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

#include 

#include 
#include 
#include 
#include 
#include 
#include 
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];
sets;
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<

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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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)<> 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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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)<>s;
    cout<

Gym - 101652U Unloaded Die

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

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

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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)<>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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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)<>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)
            {cout<

 Gym 101652R  Straight Shot

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

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

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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)<>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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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)<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<max1)
        {cout<

Gym 101652P Fear Factoring

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

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

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

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#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)<>a>>b;
    cout<

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

你可能感兴趣的:(CF,HDU,POJ,题目)