头像
真别急
发布于 01-05 17:31
+ 关注

题解

A zjscb是op

思路

比较 的大小: 如果a大于b的三分之一,则输出"力学笃行"。 如果a等于b的三分之一,则输出"劳逸结合"。 如果a小于b的三分之一,则输出"原神启动"。

代码
#include <stdio.h>

int main()
{
    double a, b;
    scanf("%lf %lf", &a, &b);
    if (a > b / 3)
        printf("力学笃行\n");
    else if (a == b / 3)
        printf("劳逸结合\n");
    else
        printf("原神启动\n");

    return 0;
}

B Tomorrow

代码1
#include<stdio.h>
int main(){
    int a,b,y,m,d;
    scanf("%d%d%d%d%d",&a,&b,&y,&m,&d);
    d++;//后一天
    if(d>b)//如果当前天数超过一个月总天数 说明进入到下一月
    {
        d=1;//新一月的第一天
        m++;//进入到下一月
    }
    if(m>a)//如果当前月数超过一年总月数 说明进入到下一年
    {
        m=1;//新一年的第一月
        y++;//进入到下一年
    }
    printf("%d %d %d",y,m,d);
    return 0;

}
思路2

    考虑成进制数,因年月日都是从1开始,因此年y,月m,日d都需减1,把总天数计算出即可(解释取模:取模可用于进制数进位,如十进制数中每一位数字都是模10的结果,因此,数字中只有1~9,没有10这个数字);在代码中 为总天数,而 为总天数转换后的年份(即总天数最多有几个一年的总天数), 为总天数转化后的日期(即总天数对每月的日数取模,得到当时的日期), 为总天数转化后的月份(即总天数除去每月的天数后对一年的月数取模,得到当时的月份)。

代码2
#include <stdio.h>
using namespace std;

int M,D,y,m,d;

int main()
{
    scanf("%d %d",&M,&D);
    scanf("%d %d %d",&y,&m,&d);
    y--,m--;
    int all = y*M*D + m*D + d;
    int yi = all/(M*D);
    int di = all%D;
    int mi = (all/D)%M;
    printf("%d %d %d",yi+1,mi+1,di+1);
}

C 篮网总冠军

思路

        因为学习完 之后才能学 ,所以答案一定是 或者 (因为可以不学大法)。遍历所有情况,在其中取最大值。但两个循环所用的时间会超出规定的时间,所以我们可以边遍历边更新学到当前大法的和,设 是学习到当前大法时的能力值,那么

代码
#include <stdio.h>
int max(int a,int b)
{
    return a>b?a:b;
}
int main() {
    int n;
    scanf("%d",&n);
    int ans=100,now=100;
    for(int i=0;i<n;i++)
    {
        int x;
        scanf("%d",&x);
        now+=x;
        ans=max(ans,now);
    }
    printf("%d",ans);
    return 0;
}

D 我要玩原神

思路

        t的范围不大,可以先将200000中的质数找出来,再从小到大遍历记录最大质数即可。

因为有多次询问,所以需要预处理一下以免超时。

代码
#include<stdio.h>
int v[200005],res[200005];
int prime(int x)
{
    if(x<2)return 0;
    for(int i=2;i*i<=x;i++)
        if(x%i==0)
            return 0;
    return  1;
}
int main()
{
    int x=0;
    for(int i=1;i<=200000;i++)
    {
        if(prime(i))
            x=i;
        res[i]=x;
    }
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&x);
        printf("%d\n",res[x]);
    }
    return 0;
}

E 神秘的数字矩阵

思路

        可以先将两部分相加再减去重叠部分,具体来说就是第 列到 列的所有数之和(可以看成公差为 (r-l+1)*d 有 项的等差数列,首项是以 为首项 为公差有 (r-l+1) 项的等差数列之和,另外两部分也差不多请大家自行思考)加第 到第 行的所有数之和减第 行到第 行与第 列与第 列重叠部分数之和。

代码1(来自刘欣老师的代码)
#include <stdio.h>
#include <stdlib.h>

long sumOfArea(int n, int row1, int col1, int row2, int col2) {
    long begin, end;
    long line_b, line_e, i;

    begin = 1 + (long)(row1 - 1) * n + (col1 - 1);
    end   = 1 + (long)(row1 - 1) * n + (col2 - 1);
    line_b = (begin + end) * (col2 - col1 + 1) / 2;

    begin = 1 + (long)(row2 - 1) * n + (col1 - 1);
    end   = 1 + (long)(row2 - 1) * n + (col2 - 1);
    line_e = (begin + end) * (col2 - col1 + 1) / 2; 

    return  (line_b + line_e) * (row2 - row1 + 1) / 2;
}

int main() {
    int n, count;
    int l, r, d, u;

    scanf("%d%d", &n , &count);

    while (count > 0) {
        int row1, col1, row2, col2;
        long sum;

        scanf("%d%d%d%d", &l, &r, &d, &u);
        row1 = d;
        col1 = l;
        row2 = u;
        col2 = r;

        sum = 0;
        sum += sumOfArea(n, 1, col1, n, col2);
        sum += sumOfArea(n, row1, 1, row2, n);        
        sum -= sumOfArea(n, row1, col1, row2, col2);

        printf("%ld\n", sum);
        count--;
    }

    return 0;
}
代码2
#include<stdio.h>
long long get_sum(long long a,long long n,long long d)
{
    return a*n+n*(n-1)*d/2;
}
long long get_val(long long x,long long y,long long n)
{
    return (x-1)*n+y;
}
int main()
{
    long long n,l,r,d,u;
    int t;
    scanf("%lld%d",&n,&t);
    while(t--)
    {
        long long ans=0;
        scanf("%lld%lld%lld%lld",&l,&r,&d,&u);
        ans=get_sum(get_sum(l,(r-l+1),1),n,(r-l+1)*n);
        ans+=get_sum(get_sum(get_val(d,1,n),n,1),(u-d+1),n*n);
        ans-=get_sum(get_sum(get_val(d,l,n),(r-l+1),1),u-d+1,(r-l+1)*n);
        printf("%lld\n",ans);
    }
    return 0;
}

F 隔开!

题意

        用空格隔开给定字符串。

思路

        简单模拟一下题目要求。

代码
#include <stdio.h>
int main() {
    char s[105];
    scanf("%s",s);
    for(int i=0;s[i];i++)
        printf("%c ",s[i]);
    return 0;
}

全部评论

(0) 回帖
加载中...
话题 回帖

等你来战

查看全部

热门推荐