Logo Enderman的博客

博客

2022信息与未来省赛题目简述

2022-07-20 10:19:10 By Enderman

【前言-考前】

I'm so vegetable.

Day -20 ~ Day -10 : 拼命做Codeforces题。

Day -9 ~ Day -4 : 开始学习二分

Day -3 ~ Day -1 : 考前大放水

【前言-考试中】

开场10分钟:血A

开场1小时40分钟:血B

开场40分钟:血C

最后10分钟:D题随便写了个骗分

【前言-考后】

拿了很差的48分。

A:15(AC AC AC AC AC)

B:15 (AC AC AC AC AC)

C:9(AC AC AC TLE TLE)

D:9(WA AC AC WA AC)

E:0 (没写,交互题不会写)

F:0(又没写,太菜)

【作者的话】

这次信息与未来难度感觉破近几年的纪录了。

但是会者不难,难者不会。

这次一等奖35分,二等奖18分。

【题目简述】

Problem 1 :难度*900左右

给定两个数L,R,求LR区间内幸运数字个数

幸运数字定义:从左往右读,每一位数字比前一位大(严格递增)。

Problem 2 :难度*1100左右

给定一个二位矩阵,只有两个字符组成:#.,分别表示水域和陆地

一个 # 能将曼哈顿距离小于等于 $k$ 的陆地变成沙滩,求沙滩面积。

Problem 3 :难度*1300左右

给定一个有 $n$ 个单词的句子,求包含26个字母的子串的最短长度(单词不能断开,例如:有两个单词 abcdef ,则子串不能为 abcd ,必须是 abcdefabcdef )。

Problem 4 :难度*1500左右

给定 $A$,$B$数组,请你构造$X$数组,使得:

$A_1×X_1+A_2×X_2+......+A_N×X_N<=0$

$B_1×X_1+B_2×X_2+......+B_N×X_N<=0$

两个条件满足其中一个。

Problem 5 :难度*1800左右

本题南京组似乎只有zxx(洛谷:Dianel_lele)巨佬AC(stO zxx Orz)。

本题是交互题。

给你一个数$N$,请你构造算式(长度必须为6),使得结果等于$N$,计算机会返回一个字符串,只包含ABX-,并且除法将不再是C++常用的整除,例如4/10*5,结果应该是2,而不是0。

后面详细说明计算机返回的状态:

假如计算机返回的结果$res$的第$i$个字符为A,说明输入的第$i$个字符与正确算式的第$i$个字符一致。

假如计算机返回的结果$res$的第$i$个字符为B,说明输入的第$i$个字符在正确算式字符串里,但位置不正确。

假如计算机返回的结果$res$的第$i$个字符为X,说明输入的第$i$个字符没有出现在正确的算式里。

假如计算机返回的结果$res$为------,说明算式结果不等于$N$,或者算式格式不合法。

一旦$res=AAAAAA$,则说明完全正确,退出猜测。

注:最多只能猜12次,否则会被判为WA。

Problem 6 :难度*1700左右

玩过俄罗斯方块的应该都知道

有两种零件AB,零件A形状如下:

□
□□

零件B形状如下:

□□

(丑)

零件可以随便反转,落到一个方块上或式是棋盘底部时会被固定住,现在给你零件的顺序,输出棋盘(未填满的行数不得超过10行)

2018信息与未来解题报告

2022-05-22 07:22:26 By Enderman

T1圣诞树

没啥好说的,暴力枚举每一层的绳子数量即可。

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    ull n,cnt=0;
    cin>>n;
    for(int i=1;i<=n-1;i++)cnt+=2*i;
    cnt+=(n-1);
    cout<<cnt<<endl;
    return 0;
}

T2 最大公约数

f1:暴力YYDS!

从三个数中选个最小的,直接一路干到1。在这期间如果找到一个数$i$能被三个数同时整除,输出$i$,$b$$r$$e$$a$$k$即可。

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int a,b,c;
    cin>>a>>b>>c;
    for(int i=min(a,min(b,c));i>=1;i--)
        if(a%i==0&&b%i==0&&c%i==0)
        {
            cout<<i<<endl;
            return 0;
        } 
    return 0;
}

f2:欧几里得算法(辗转相除法)

不解释,请上网自查。(懒)

T3 双十一

裸的日期问题。定义一个数组$a$,如果$a_x$$=$$1$,表示$x$年的双十一在周末。否则直接PASS。同时也要做越界处理,比如$2$$0$$2$$1$年$1$$3$月?!$1$$9$$9$$9$年$1$月$32$日?!这些日期都是不合法的,要做特殊处理。

注意:2月也要特殊对待,因为2月有时候28天,有时候29天。

这些预处理做完后,输入StartYear,EndYear。然后区间内查找$a_i$是否等于$1$即可。

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int cnt,a[3001],year=1900,month=1,day=1,xq=1,b[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    while(year<=3000)
    {
        if((year%4==0&&year%100!=0)||year%400==0)b[2]=29;
        else b[2]=28;
        if(month==11&&day==11)
        {
            if(xq==6||xq==0)a[year]=1;
            else a[year]=0;
        }
        day++;
        if(day>b[month])
        {
            month++;
            day=1;
        }
        if(month>12)
        {
            year++;
            month=1;
            day=1;
        }
        xq=(xq+1)%7;

    }
    int st,en;
    cin>>st>>en;
    for(int i=st;i<=en;i++)
        if(a[i])
            cnt++;
    cout<<cnt<<endl;
    return 0;
}

T4 素数方阵

想AC这题可以看看简化版:蛇形方阵 AC简化版后,只需要加入亿些变量即可。

#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <set>
#include <queue>
#include <stack>
#include <cctype>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int n,a[21][21],k=2,x=1,y=0,sex,sey,f=1;
//f表示已经填过的格子数
int isprime(int x)
{
    for(int i=2;i<x;i++)
        if(x%i==0)
            return false;
    return true;
}
int next(int x)//从x开始,寻找下一个质数
{
    x++;
    while(!isprime(x))x++;
    return x;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>sex>>sey;
    while(f<=n*n)//填数
    {
        while(y<n&&!a[x][y+1])a[x][++y]=k,k=next(k),f++;
        while(x<n&&!a[x+1][y])a[++x][y]=k,k=next(k),f++;
        while(y>1&&!a[x][y-1])a[x][--y]=k,k=next(k),f++;
        while(x>1&&!a[x-1][y])a[--x][y]=k,k=next(k),f++;
    }
      cout<<a[sex][sey]<<endl;//输出
    return 0;
}

T5 整数乘方

高精乘法预警!

#include <bits/stdc++.h>
using namespace std;
int c[10001],a,n,len=1,A,B,pos;
void mul(int *c,int x)//高精乘法函数
{
    int jw=0;//将进位赋值为0
    for(int i=1;i<=10000;i++)//模拟乘法,人怎么算它就怎么算
    {
        c[i]=c[i]*x+jw;
        jw=c[i]/10;
        c[i]%=10;
    } 
}
int main()
{
    cin>>a>>n;
    c[1]=1;//一定要复值为1!!!
    for(int i=1;i<=n;i++)mul(c,a);
    for(int i=10000;i>=1;i--)//干掉前缀0
        if(c[i]!=0)
        {
            pos=i;
            break;
        }
    for(int i=pos;i>=1;i--)
        if(c[i]%2==0)B++;
        else A++;
    cout<<A-B<<endl;
    return 0;
}

T6 棋盘游戏

这道题HelloWorldRoom好像没有哎。

这道题可以用曼哈顿距离去做,就变得很简单了。

没有代码!

众所周知,96=100。

2022-05-03 10:59:27 By Enderman

AC了#2697后,发现。。。。。。

原因:每组测试数据16分,一共6组数据,16×6=96.

然后评测机显示100分!

也就是说96=100!(数学老师当场进入hospital,原因:血压飙升)

望改正。

共 3 篇博客