Logo xushuoxin的博客

博客

#412 题解

2023-03-25 21:43:52 By xushuoxin

前话:这题也太坑了吧,点在圆的边缘上也算穿过?

这题其实并不难,算法标签写的是图论,个人觉得是模拟

结构体保存圆中心的坐标与半径.

遍历每个圆,得出圆中心到曲线起点的距离与圆中心到曲线终点的距离.(注意使用欧几里得距离算法)

判断三种情况,一种是曲线从外往里经过(终点在圈内),一种是从里往外经过(起点在圈内),还有一种就是绕过这个圈(起点终点都不在圈内,或者都在圈内,都在圈外虽然也可以穿过,但是我们要求的是这条曲线最少要穿过的圆的个数).

现在,之前得出的起点(终点)到圆中心的距离就派上用场了,如果距离超过(或等于)圆的半径,就在圈外,否则在圈内.

最后,如果这个圆属于之前三种情况的前两种,这条曲线就要多穿过一个圆.

结束,剩下程序自己做吧.

小提示:

欧几里得算法求距离
sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))

#865 题解

2023-03-24 22:42:46 By xushuoxin
前话:
zuotingting
865把你的答案写个题解给大家看下。
发送时间:2023-03-24 09:27:58
查看时间:2023-03-24 16:57:06
老师要求我写的啊,新思路看不懂不背锅(都这么详细了,我尽力了)……

题目链接

首先理解题意,根据样例,知道$2^n$就是这个图腾的行数.

仔细数一下每行的前导空格个数,发现是总行数-当前行数.

接着,重点来了,由于这个图腾构造有序,大致可以如下表示,保存在布尔型数组里.

大小为1  大小为2   大小为3
   1       1         1
  1 1     1 1       1 1
         1 0 1     1 0 1
        1 1 1 1   1 1 1 1
                 1 0 0 0 1
                1 1 0 0 1 1
               1 0 1 0 1 0 1
              1 1 1 1 1 1 1 1

如上,一个0就表示两个空格,奇数行的一个1表示"/\",偶数行的两个1表示"/__\".

那怎样用布尔数组得到大体的图腾呢?很简单,以大小是2的图腾为例,

首先,我们得把数组全赋成0,然后,把它第一行唯一一个1,根据数组位置(1,1)保存进去.

(小提示:数组外面多包一层0,不然会越界.)

初始数组:
0 0 0 0 0
0 1 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0

然后,从第二行开始,偶数行挨列判断上面一行的这个位置与上面一行的前一个位置是否都是0(没有三角形的尖).

奇数行挨列判断上面一行的这个位置与上面一行的前一个位置是否都是1(新的三角形要么在上面一个三角形的左边,要么在右边,不能在中间).

如果判断为否,则这个位置可以补全(新增)一个小三角形,数组保存为1,否则为0(空格).

总的来说,就是保存上面一行的这个位置与上面一行的前一个位置的异或运算的结果.

实践一下.

第一次修改.
0 0 0 0 0
0 1 0 0 0
0 1 1 0 0
0 0 0 0 0
0 0 0 0 0
第二次修改.
0 0 0 0 0
0 1 0 0 0
0 1 1 0 0
0 1 0 1 0
0 0 0 0 0
第三次修改.
0 0 0 0 0
0 1 0 0 0
0 1 1 0 0
0 1 0 1 0
0 1 1 1 1
Over!

布尔数组转成图腾见上文,不说了.

还有一点,"\"在c++中不能直接输出,要写成(char)(92).

上AC代码!(可能有些细节跟上面思路不一样,但大体相同,也是正确的).

#include<bits/stdc++.h>
using namespace std;
int n,h,a[3005][3005];
void output(string s){
    cout<<s<<(char)(92);
    return;
}
int main(){
    cin>>n;a[0][0]=1,h=pow(2,n);
    for(int i=1;i<=h;i++){
        for(int j=i;j<h;j++)
            cout<<" ";
        for(int j=1;j<=i;j++)
            a[i][j]=(a[i-1][j]+a[i-1][j-1])%2;
        for(int j=1;j<=i;j++){
            if(i%2!=0){
                if(a[i][j])
                    output("/");
                else
                    cout<<"  ";                
            }
            else{
                if(a[i][j]&&a[i][++j])
                    output("/__");
                else
                    cout<<"   ";            
            }
        }
        cout<<endl;
    }
    return 0;
}

2023年3月份月赛 题解

2023-03-19 18:42:58 By xushuoxin

A题 礼物 题目链接

比赛中最简单的送分题,基本没有任何算法,就是求网格中每一条横轴(或竖轴)上的价值总和,然后取其中最大值输出.

但是,题目中有一个很重要的信息:不同礼物可能会在同一个格子。所以,应该是给这个格子加价值(+=),而不是赋价值(=).否则70分.

还有一点:数据保存时必须用long类型,int类型会超出范围,不然80分.(比赛时无意之举,直接加上20分)

接着,上代码!!!

#include<iostream>
using namespace std;
long n,m,mx,s,a[1005][1005],x,y,v;
int main(){
    cin>>n>>m;
    for(int i=0;i<m;a[x][y]+=v,i++)
        cin>>x>>y>>v;
    for(int i=1;i<=n;i++){
        s=0;
        for(int j=1;j<=n;j++)
            s+=a[i][j];
        mx=max(mx,s);
    }
    for(int i=1;i<=n;i++){
        s=0;
        for(int j=1;j<=n;j++)
            s+=a[j][i];
        mx=max(mx,s);
    }
    cout<<mx;
    return 0;
}

B题 数字游戏 题目链接

这题已经稍微有点难了,毕竟对于100%的数据,T≤20,n_i≤1000000 数据有点大

首选深搜做法(一开始我就这么做的) 超时,30分.

#include<iostream>
using namespace std;
int T,s,mi;
void dfs(int x,int ans){
    if(x==0){
        mi=min(mi,ans);
        return;
    }    
    if(x%3==0)
        dfs(x/3,ans+1);
    if(x%2==0)
        dfs(x/2,ans+1);
    dfs(x-1,ans+1);
}
int main(){
    cin>>T;
    for(int i=0;i<T;i++){
        cin>>s;mi=s;
        dfs(s,0);
        cout<<mi<<" ";
    }
    return 0;
}

后来测数据时发现有很多都超时了,既然这样,就空间换时间,动规换搜索,用上刚学的dp,100分.

#include<iostream>
using namespace std;
int T,s,dp[1000005];
int main(){
    cin>>T;
    for(int i=0;i<T;i++){
        cin>>s;
        dp[1]=1;
        for(int j=2;j<=s;j++){
            dp[j]=dp[j-1]+1;
            if(j%2==0)
                dp[j]=min(dp[j],dp[j/2]+1);
            if(j%3==0)
                dp[j]=min(dp[j],dp[j/3]+1);
        }
        cout<<dp[s]<<" ";
    }
    return 0;
}

C题 苹果gcd 题目链接

二分做法 60分,待会再看看(好吧,看不出来,是不是不能二分最大公约数啊?).

#include<bits/stdc++.h>
using namespace std;
int n,s,l,m,h=1e+7,a[1000005];
long long k;
bool check(){
    long long sum=0;
    for(int i=0;i<n;i++)
        sum+=a[i]%m;
    return sum<=k;
}
int main(){
    cin>>n>>k;
    for(int i=0;i<n;h=min(h,a[i]),i++)
        cin>>a[i];
    while(l<=h){
        m=(l+h)/2;
        if(check())
            s=m,l=m+1;
        else
            h=m-1;
    }
    cout<<s;
    return 0;
}

D题 通关游戏 题目链接

首先看到这种求方案数超大的题目,基本可以推断出这是一道数论题.

这个数论到底是什么呢,先列两组数据看看.

input 1

3

0 1 2

1 2 3

output 1

0 4(方案BAA,BAB,BBA,BBB四种)

input 2(数据纯自拟)

4

0 1 4 5

0 2 3 4

output 2

1 8(方案ABAA,ABAB,ABBA,ABBB,BBAA,BBAB,BBBA,BBBB八种)

第一步就很明了了,给数组从小到大排序(但要用结构体把A班i号同学擅长的关号和B班i号同学擅长的关号捆绑在一起,不然排序就排乱了)

第二步根据题意,在面对A班i号同学和B班i号同学时,肯定要选择一个,如果只有一位(或者没有)同学擅长当前算的能到的最小关卡,则不可行,因为可以选其中不擅长这个最小关卡的同学,而如果两位同学都擅长,就一定可以进入下一关(选哪个都行).这样过一遍我们就可以得出通关游戏能到的最小关卡编号了.

第三步,相信直接可以看出,两组(应该是所有,不信可以再列几组看看)数据中能到最小关卡的选择方案数都是2的正整数次幂.但只看两组数据的话,肯定会有小白说,那这个公式是不是2^(n-1)啊?NO,NO,NO.首先,我们要搞清楚,两个班选一半同学的总方案数,如果不受限制,总共应该是2^n个,而如果i号的A班同学,或B班同学擅长的关是前面算出的能到的最小关卡,那选人时就要避开他,选另一个班的同学,而这样的选择对于增加方案数毫无意义,因为选哪个都早固定了,选了,等于没选,不计入结果.反之,你就有两种选择(选A班或选B班),总方案数就乘2(注意一开始总方案数设为1,常识).

不知道听没听懂,有点难理解,只可意会,不可言传.

反正先把AC代码上了

#include<bits/stdc++.h>
using namespace std;
long n,s,ans=1;
struct node{
    int x,y;
}a[1000005];
bool cmp(node q,node p){
    return min(q.x,q.y)<min(p.x,p.y);
}
int main(){
    cin>>n;
    for(int i=0;i<n;i++)
        cin>>a[i].x;
    for(int i=0;i<n;i++)
        cin>>a[i].y;
    sort(a,a+n,cmp);
    for(int i=0;i<n;i++)
        if(a[i].x==s&&a[i].y==s)
            s++;
    cout<<s<<endl;
    for(int i=0;i<n;i++)
        if(a[i].x!=s&&a[i].y!=s)
            ans*=2,ans%=998244353;
    cout<<ans;
    return 0;
}

完结,撒花!!!(溜了溜了,太难了)

打卡题#983题解

2023-03-17 20:24:42 By xushuoxin

题目链接

啊呀,打卡题第一次又不是满分,痛定思痛,竟发现substr函数第二位写成了字符串尾坐标……

于是,决定写一篇题解【绝对原创】

题意非常简单,就是求字符串的最长连续回文子串长.

下面介绍我的思路(可能有点笨,也许能优化一下)

1.首先请备好这一回文函数bool huiwen(string s);(内容自己扩充).

2.接收字符串,.length()(或.size())函数算出其长度.

3.j,k两个参数循环穷举出子串的头坐标和尾坐标.

4.通过上一步的两个参数,用substr函数截取母串得子串.

5.用回文函数判断一下子串符合不符合要求,符合则保存长度.

6.如果上一步符合,比较看看是否是最长长度,是则保存进变量.

7.输出结果,Over!

这样来看,还是很简单的.(一开始没做对,有啥用?)

欢迎评论区留言+讨论!!!

题解征集+《将刷题》

2022-12-28 14:59:15 By xushuoxin

本篇博客较长,大家一定要耐心读完

第一部分:题解征集

大家有没有题不会做的?在评论区打出题号,我选择性写题解

若题解有误,望大家多多指出

我要写题解的题有部分要求:

1.不可以太简单,语法班的题就不要说了

2.仅支持本评测系统上能找到的题

3.除了以上两条,我还会根据情况在筛选一下

4.哦对了,还有最后一点:大佬勿看

完毕

第二部分:分享一下我看到的一篇《将刷题》(重点来了)

君不见,茫茫之题天上来,复杂到海不舍回。

君不见,高堂明镜悲白发,朝如青丝暮成雪。

人生WAWA须尽思,莫使电脑空对题。

天生我材没有用,千方百计还RE。

AC一点且为乐,会须一刷三百WA。

吾团友,牛大佬,

将刷题,手莫停!

与题做一遍,请系统为蒟蒻以测评。

天天WAWA不足贵,但愿长眠不复醒!

古来大佬皆刷题,惟有蒟蒻水犇犇。

站长昔时百AC,斗题十千恣欢谑。

主人何为言AC?径须沽取对君WA。

TLE,MLE,OLE, WA 和 RE

呼儿将出换AC,与尔同销万古愁!!!!

昔人已乘网络去,此地空余网络流。

网络一去不复返,代码千行空悠悠。

深搜历历TLE,广搜萋萋MLE。

最大流它何处是,费用流它使人愁

昨夜机房夜送客,电线主机秋瑟瑟。

主人下位客在外,举手欲敲平衡树。

回溯不当惨超时,保存茫茫未命名。

忽闻隔壁键盘声,主人失误测评WA。

寻声暗问码者谁?键盘声停欲语迟。

看门相近邀相见,点回私信重开宴。

千呼万唤始出来,犹抱键盘半遮面。

转手按下Ctrlc,未成高精先暴力。

define掩抑KMP,似诉广搜要用QUEUE。

低眉信手续续码,说尽深搜无限事。

轻打慢敲按复码,初为递推又暴力。

线性嘈嘈如急雨,对数切切如私语。

线性对数错杂码,超时注释落满屏。

键盘洒水手指滑,满是代码改回难。

寒冷机房敲代码,代码CE声暂歇。

别有幽愁TLE,此时WA胜CE。

停止工作未命名,蓝屏突出UKE。

码后打上return0,四键一声如RE。

东街西坊悄无言,唯见码者脸苍白……

注:摘自Benny的个人主页(洛谷上的),有改动,李白《将进酒》的改编版(但不完全是).(洛谷果然"人才"辈出)

顺便提一嘴:李白看着作者你这么改,估计心都碎了,建议你补上一刀把《蜀道难》改编成《刷题难》

文中缩写注释:

1.WA:Wrong Answer

2.RE:Runtime Error

3.AC:Accepted

4.TLE:Time Limit Exceeded

5.MLE:Memory Limit Exceeded

6.OLE:Output Limit Exceeded

7.CE:Compile Error

8.Cirlc:Cirl-c复制快捷命令

9.QUEUE:队列,懂的都懂

10.KMP,UKE就不要问我了,问就是不知道

11.里面涉及到一些高级算法,建议食用算法5个月的人细细品读.

HelloWorld评测系统现状:

稻花香里说丰年,听取WA声一片(WA:Wrong Answer)

终于写完了,望大家支持!!!!!!!!!

私信功能好像被取消了!!!

2022-08-20 10:10:28 By xushuoxin

以前我们发私信是不是点击一个人的个人信息然后再点发送私信的?(以前聊过的除外)

现在不行了,只能去访问博客.

但可以点击自己以前聊过的私信:

个人信息

私信(点这里)

系统消息

从来没发过私信的,就没法再发私信了

(本博客所指编程在线判题系统,非整个helloworld系统!)

#743. 网线切割题目描述有误

2022-08-16 19:58:40 By xushuoxin

输入文件的第一行由两个整数N和K组成,由一个空格间隔。N(1≤N≤10000)是仓库里光缆的数目,K(1≤K≤10000)是需要的网线数目。

接下来的N行每行只有一个实数,告诉你每根缆线的长度(单位:m)。这些网线至少长1m,最多不超过100km。

所有的长度精确到cm,且小数点后有且仅有两位

Test #1:

score: 10

time: 0ms

memory: 1628kb

input:

59 67

10.5933(说好的两位小数呢)

8.5933

1.5933

2.5933

3.5933

4.5933

1.5933

6.5933

8.5933

8.5933

4.5933

8.5933

3.5933

5....

output:

3.53

Test #2:

score: 10

time: 1ms

memory: 1628kb

input:

96 52

3.5933

2.5933

10.5933

2.5933

4.5933

2.5933

6.5933

4.5933

4.5933

7.5933

10.5933

5.5933

8...

output:

5.59

Test #3:

score: 10

time: 0ms

memory: 1632kb

input:

51 14

8.5933

6.5933

8.5933

8.5933

4.5933

5.5933

6.5933

3.5933

1.5933

10.5933

1.5933

1.5933

10.5933

5...

output:

8.59

Test #4:

score: 10

time: 0ms

memory: 1636kb

input:

24 4

1.5933

6.5933

7.5933

4.5933

2.5933

8.5933

9.5933

5.5933

6.5933

8.5933

1.5933

2.5933

5.5933

4.59...

output:

9.59

Test #5:

score: 10

time: 0ms

memory: 1636kb

input:

60 2

3.5933

2.5933

6.5933

9.5933

4.5933

5.5933

3.5933

3.5933

6.5933

8.5933

10.5933

2.5933

7.5933

9.5...

output:

10.59

Test #6:

score: 10

time: 0ms

memory: 1632kb

input:

110 5283

56.5933

61.5933

12.5933

43.5933

72.5933

41.5933

93.5933

38.5933

39.5933

90.5933

40.5933

92....

output:

0.99

Test #7:

score: 10

time: 2ms

memory: 1660kb

input:

2569 7690

81.5933

43.5933

90.5933

43.5933

87.5933

77.5933

16.5933

33.5933

57.5933

76.5933

11.5933

46...

output:

14.52

望改正

#4966. 扫描识别 测试数据有误

2022-07-25 12:52:32 By xushuoxin

首先看题目

已知,可能出现的错误有如下几种:

1、把数字0错误地识别为大写字母O;

2、把数字1错误地识别为小写字母l;(划重点,是小写'l'不是大写'I'!)

3、把数字2错误地识别为大写字母Z;

4、把数字5错误地识别为大写字母S;

5、把数字6错误地识别为小写字母b;

6、把数字8错误地识别为大写字母B;

7、把数字9错误地识别为小写字母q;

再看一组数据

Test #3:

score: 0

Wrong Answer

time: 0ms

memory: 1512kb

input:

3I12S415b542S52Z879B

output:

3I125415654255228798

result:

wrong answer 1st words differ - expected: '31125415654255228798', found: '3I125415654255228798'

这个大写'I'是几个意思?不是说小写'l'才是1吗?

望改正!

新系列再度来袭![盘点我们的头像]

2022-06-04 21:55:39 By xushuoxin

新系列博客再度来袭![盘点系统里的bug]

2022-06-03 22:06:44 By xushuoxin

1.比赛页面里的bug:

你是不是以为在题库里搜不到考试题,无法查看测试数据就不能作弊了?

不然,我平时喜欢在提交记录里去查题目,在比赛时你提交程序会显示 — 这条杠会把你算为暂时性AC.

AC了一道题后是可以看到别人具体程序的,比赛时虽然题目从题库中移除了,但提交记录没有——

这说明你就可以看别人以前的AC程序了!!!

(以上是我发现后用小号亲自测验的,我怕吃亏又不敢,就没这么做)

望修复(修复一下把 - 算为暂时性AC的问题)!

2.待更新…

共 50 篇博客