2022 省赛c++B组

门牌制作

暴力跑一遍存一下答案,最后输出624即可

既约分数

把分子分母分别枚举,判断分子分母gcd值是否为1

#include<iostream>
using namespace std;
int gcd(int a,int b)
{
    return b?gcd(b,a%b):a;
}
int main()
{
    int ans=0;
    for(int i=1;i<2021;i++)
    {
        for(int j=1;j<2021;j++)
        {
            if(gcd(i,j)==1) ans++;
        }
    }
    cout<<ans-1<<endl;
}

蛇形填数

模拟即可,或者也可以观察1 1到2 2 到3 3 的路径,发现规律,不过这种方法的代码忘记保存了

#include<iostream>
using namespace std;
int a[50][50];
int main()
{
    int num=0;
    for(int i=1;i<=40;i++)
    {
        if(i%2==1)
            for(int j=i,k=1;j>=1;j--,k++)
                a[j][k]=++num;
        else
            for(int j=1,k=i;k>=1;k--,j++)
                a[j][k]=++num;
    }
        cout<<a[20][20]<<endl;
}

七段码

并差集加dfs

用二维数组把不同灯管之间相邻的关系表示出来,dfs暴力跑出所有情况,判断每一种情况是否满足灯亮且满足二维数组所存的相邻关系,存在就存进并查集,最后检查并查集是否只有一个即可

#include<iostream>
using namespace std;
const int N = 10;
int used[N], fa[N];
int ne[N][N];
int m, ans;
int find(int x)
{
    return fa[x] == x ? x : fa[x] = find(fa[x]);
}
void dfs(int n)
{
    if (n > 7)
    {
        for (int i = 1; i <= m; i++) fa[i] = i;
        for (int i = 1; i <= m; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                if (used[i] && used[j] && ne[i][j])
                {
                    int dx = find(i), dy = find(j);
                    if (dx != dy)
                    {
                        fa[dx] = dy;
                    }
                }
            }
        }
        int check = 0, last = 0;
        for (int i = 1; i <= m; i++)
        {
            if (used[i])
            {
                if (last == 0)
                {
                    last = find(i);
                }
                if (last != find(i))
                {
                    check = 1;
                    break;
                }
            }
        }
        if (!check)
        {
            ans++;
            //for (int i = 1; i <= m; i++)cout << used[i];
            //puts("");
        }
        return;
    }
    used[n] = 1;
    dfs(n + 1);
    used[n] = 0;
    dfs(n + 1);
}
void solve()
{
    m = 7;
    ne[1][2] = ne[1][6] = 1;
    ne[2][1] = ne[2][3] = ne[2][7] = 1;
    ne[3][7] = ne[3][2] = ne[3][4] = 1;
    ne[4][3] = ne[4][5] = 1;
    ne[5][4] = ne[5][6] = ne[5][7] = 1;
    ne[6][5] = ne[6][7] = ne[6][1] = 1;
    ne[7][6] = ne[7][5] = ne[7][3] = ne[7][6] = 1;
    dfs(1);
     
    cout << ans - 1 << endl;
}
int main()
{
    solve();
}

跑步锻炼

按照题意模拟即可

#include<iostream>
#include<algorithm>
#include<cstring>
#define int long long
using namespace std;
int ans;
int year, month, day, week;
int m[14];
void init()
{
    m[1] = m[3] = m[5] = m[7] = m[8] = m[10] = m[12] = 31;
    m[4] = m[6] = m[9] = m[11] = 30;
    m[2] = 28;
}
int check()
{
    return (year % 4==0 && year % 100 != 0 || year % 400==0);
}
void dayup()
{
    if (check()) m[2] = 29;
    else m[2] = 28;
    day++;
    if (day > m[month]) month++, day = 1;
    if (month > 12) month = 1, year++;
    week++;
    if (week == 8) week = 1;
}
 
void solve()
{
    init();
    while (1)
    {
        ans += 1;
        if (day == 1 || week == 1) ans += 1;
        if (year == 2020 && month == 10 && day == 1)
        {
            cout << ans << endl;
            return;
        }
        dayup();
 
    }
 
} 
signed main()
{
    year = 2000, month = day = 1, week = 6;
    solve();
}

回文日期

偷了个懒,用上一题代码暴力跑了所有年月日发现只有331个回文日期,所以就预先处理好,再进行判断了

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#define int long long
using namespace std;
int ans;
int year, month, day;
int m[14];
string b[350] = { "10011001","10100101","10111101","10200201","10211201","10300301","10400401","10500501","10600601","10700701","10800801","10900901","11011011","11100111","11111111","11200211","11211211","11300311","11400411","11500511","11600611","11700711","11800811","11900911","12011021","12100121","12111121","12200221","12211221","12300321","12400421","12500521","12600621","12700721","12800821","12900921","13011031","13100131","13211231","13300331","13500531","13700731","13800831","20011002","20100102","20111102","20200202","20211202","20300302","20400402","20500502","20600602","20700702","20800802","20900902","21011012","21100112","21111112","21200212","21211212","21300312","21400412","21500512","21600612","21700712","21800812","21900912","22011022","22100122","22111122","22200222","22211222","22300322","22400422","22500522","22600622","22700722","22800822","22900922","30011003","30100103","30111103","30200203","30211203","30300303","30400403","30500503","30600603","30700703","30800803","30900903","31011013","31100113","31111113","31200213","31211213","31300313","31400413","31500513","31600613","31700713","31800813","31900913","32011023","32100123","32111123","32200223","32211223","32300323","32400423","32500523","32600623","32700723","32800823","32900923","40011004","40100104","40111104","40200204","40211204","40300304","40400404","40500504","40600604","40700704","40800804","40900904","41011014","41100114","41111114","41200214","41211214","41300314","41400414","41500514","41600614","41700714","41800814","41900914","42011024","42100124","42111124","42200224","42211224","42300324","42400424","42500524","42600624","42700724","42800824","42900924","50011005","50100105","50111105","50200205","50211205","50300305","50400405","50500505","50600605","50700705","50800805","50900905","51011015","51100115","51111115","51200215","51211215","51300315","51400415","51500515","51600615","51700715","51800815","51900915","52011025","52100125","52111125","52200225","52211225","52300325","52400425","52500525","52600625","52700725","52800825","52900925","60011006","60100106","60111106","60200206","60211206","60300306","60400406","60500506","60600606","60700706","60800806","60900906","61011016","61100116","61111116","61200216","61211216","61300316","61400416","61500516","61600616","61700716","61800816","61900916","62011026","62100126","62111126","62200226","62211226","62300326","62400426","62500526","62600626","62700726","62800826","62900926","70011007","70100107","70111107","70200207","70211207","70300307","70400407","70500507","70600607","70700707","70800807","70900907","71011017","71100117","71111117","71200217","71211217","71300317","71400417","71500517","71600617","71700717","71800817","71900917","72011027","72100127","72111127","72200227","72211227","72300327","72400427","72500527","72600627","72700727","72800827","72900927","80011008","80100108","80111108","80200208","80211208","80300308","80400408","80500508","80600608","80700708","80800808","80900908","81011018","81100118","81111118","81200218","81211218","81300318","81400418","81500518","81600618","81700718","81800818","81900918","82011028","82100128","82111128","82200228","82211228","82300328","82400428","82500528","82600628","82700728","82800828","82900928","90011009","90100109","90111109","90200209","90211209","90300309","90400409","90500509","90600609","90700709","90800809","90900909","91011019","91100119","91111119","91200219","91211219","91300319","91400419","91500519","91600619","91700719","91800819","91900919","92011029","92100129","92111129","92200229","92211229","92300329","92400429","92500529","92600629","92700729","92800829","92900929"};
vector<string> a;
 
void init()
{
    for (int i = 0; i < 331; i++) {
        string str = b[i];
        bool find = 1;
        for (int j = 0; j <= 1; j++)
        {
            if (str[j] != str[j + 2]) find = 0;
        }
        if (find == 1) a.push_back(str);
    }
 
}
signed main()
{
    init();
    int t;
    cin >> t;
    while (t--)
    {
        string str;
        cin >> str;
        //cout << str << endl;
        for (int i = 0; i < 331; i++)
        {
            if (b[i] > str) {
                cout << b[i] << endl;
                break;
            }
        }
        for (auto x : a)
        {
            if (x > str) {
                cout << x << endl;
                break;
            }
        }
    }
}

成绩统计

注意四舍五入

#include<iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#define int long long
using namespace std;
 
void cal(double s)
{
    int old = s;
    s *= 10;
    //cout << s << endl;
    int g = s;
     
    g %= 10;
    if (g >= 5)old++;
    cout << old << '%' << endl;
}
void solve()
{
    int n;
    cin >> n;
    double ji = 0, you = 0;
    double sum = n;
    for (int i = 1; i <= n; i++)
    {
        int num;
        cin >> num;
        if (num >= 85) you++;
        if (num >= 60) ji++;
    }
    double case1 = ji * 100 / sum, case2 = you * 100 / sum;
    cal(case1);
    cal(case2);
     
}
signed main()
{
    solve();
}

子串分值和

数学,用贡献来描述一个字母对由它产生的字串的f值的影响,首先每一个字母都可以产生有它本身为第一位的连续子串,值为(n-i+1),例如a,ab,abc 这三个字串的f值里面都有a的贡献。

同时这些连续字串也可以作为后缀,与前面的字串结合,形成新的字串,例如bca,bcab,bcabc这三个字串的f值里面都有a的贡献,但是bca之前再加一个a (abca)就不可以算作后面那个a的贡献,而是第一次出现的字母a的贡献。

所以我们可以归纳出,一个连续字串的f值是由第一次出现的字母所贡献出来的,反过来,我们可以根据所给字母,构造出由它作为第一次出现的连续字串。

#include<iostream>
#include<cstring>
#include<map>
#include<set>
#define int long long
using namespace std;
const int N = 1e6 + 10;
int pre[30];
void solve()
{
    string str;
    cin >> str;
    int n = str.length();
    int ans = 0;
    str = '0' + str;
    for (int i = 1; i <= n; i++)
    {
        ans += (n - i + 1) * (i - pre[str[i] - 'a' + 1]);
        pre[str[i] - 'a' + 1] = i;
    }
    cout << ans << endl;
 
}
signed main()
{
    solve();
}

平面切分

  1. 每多一条直线就多至少一个平面。

  1. 多一条直线与当前之前所交的不重复点个数k就多k个平面

#include <iostream>
#include <set>
using namespace std;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
 
set<PII> s;



 
int main()
{
    int res = 1;
    int n;
    cin >> n;
    while (n--)
    {
        int a, b;
        cin >> a >> b;
        if (s.find({a, b}) != s.end()) 
            continue;
        res++; 
 
        set<PDD> jd;                                   
        for (auto it = s.begin(); it != s.end(); it++) 
        {
           
            double x = (it->second - b) * 1.0 / (a - it->first);
            double y = a * x + b;
            
            if (a != it->first && jd.find({x, y}) == jd.end())
            {
                res += 1;
                jd.insert({x, y});
            }
        }
        s.insert({a, b});
    }
    cout << res << endl;
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值