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) 回帖