• 我是一个粉刷匠


    比赛前一天晚上凌晨一点被什么声音吵醒,以为是飞蛾,结果打开灯一看,露露的蚊帐垮了,然后角落处有一只螳螂,差点就吓哭了。

    那之后我特别想买一个金钟罩,把全身套住,这样就再也不怕小动物来袭了。

    赶了半个小时终于赶跑了,又睡不着,就索性破罐子破摔玩起了狼人杀,玩到凌晨5点,差点被我的狼队友气哭了,一摔手机就睡,三个小时之后就又起来集训了。

    昨天我神志不清的,特别是做这道F题,先是判断条件写错,wa了几发,然后又两重循环超时,当时榜上面好像只有我们没过,前面的队后面的队都过了,这使我想起了蔡队的一句名言:“人尽皆知傻逼题”

    在wa了11发之后!我们终于过了!我罚时我快乐!!!

    不用队列,不用设两倍的数组,判断总和比较就行了。

    #include <iostream>
    #include<stdio.h>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<queue>
    #include<map>
    using namespace std;
    map<int,int>vis;
    int main()
    {
    int n,m,a[100001]={0},j,temp=0,i,k,pre[100001]={0};
    cin>>n;
    int sum=0;
    for(i=1;i<=n;i++)
    {
        cin>>a[i];
        pre[i]=a[i]+pre[i-1];
        vis[pre[i]]++;
        sum+=a[i];
    }
    if(sum%3!=0)
        cout<<0<<endl;
    else
    {
        int ans=sum/3;
        int count=0,temp=0,cnt=0;
     for(i=1;i<=n;i++)
     {
             if(vis[ans+pre[i]]&&vis[ans*2+pre[i]]) cnt++;
    }
     cout<<cnt<<endl;
    }
    
    return 0;
    }

    下一道是G,这一道是Pzr过的,先以1所在行交换列,再以1所在列交换行。

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int main()
    {
        int num[305][305];
        int n,m;
        int a=0,b=0;
        int sum=0;
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                cin>>num[i][j];
                if(num[i][j]==1){
                    a=i;
                    b=j;
                }
            }
        }
        for(int i=1;i<=m;i++){
            if(num[a][i]!=i){
                int flag=0;
                for(int j=i+1;j<=m;j++){
                    if(num[a][j]==i){
                        if(i==1) b=j;
                        sum++;
                        flag=1;
                        for(int t=1;t<=n;t++){
                              swap(num[t][j],num[t][i]);
                        }
                    }
                }
                if(flag==0){
                    cout<<'*'<<endl;
                    return 0;
                }
            }
        }
        for(int i=1;i<=n;i++){
            if(num[i][b]!=(i-1)*m+b){
                int flag=0;
                for(int j=i+1;j<=n;j++){
                    if(num[j][b]==(i-1)*m+b){
                        sum++;
                        flag=1;
                        for(int t=1;t<=m;t++){
                              swap(num[j][t],num[i][t]);
                        }
                    }
                }
                 if(flag==0){
                    cout<<'*'<<endl;
                    return 0;
                }
            }
        }
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(num[i][j]!=((i-1)*m+j)){
                    cout<<'*'<<endl;
                    return 0;
                }
            }
        }
        cout<<sum<<endl;
        return 0;
    }

    然后是C,画了很久的图最后终于开窍了,最关键的一个地方就是两个数组f和g,用F保存原始位置,记录现有位置,用G记录之前变换的序号,然后dfs遍历雇主就行了。

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<math.h>
    #include<algorithm>
    #include<vector>
    const int maxn=99999999;
    using namespace std;
    int a[505],f[505],g[505],vis[505],ans;
    vector<int>v[505];
    void dfs(int p)
    {
        vis[p]=1;
        for(int i=0; i<v[p].size(); i++)
        {
            int k=v[p][i];
            if(!vis[k])
            {
                ans=min(ans,a[f[k]]);
                dfs(k);
            }
        }
    }
    int main()
    {
        int n,m,q,i,x,y,w,z,p;
        char c;
        cin>>n>>m>>q;
        for(i=1; i<=n; i++)
            cin>>a[i];
        for(i=0; i<m; i++)
        {
            cin>>x>>y;
            v[y].push_back(x);
        }
        for(i=1; i<=n; i++)
        {
            f[i]=i;
            g[i]=i;
        }
        for(i=0; i<q; i++)
        {
            cin>>c;
            if(c=='T')
            {
                cin>>w>>z;
                swap(f[g[w]],f[g[z]]);
                swap(g[w],g[z]);
            }
            else
            {
                cin>>p;
                p=g[p];
                memset(vis,0,sizeof(vis));
                ans=maxn;
                dfs(p);
                if(ans==maxn)
                    cout<<"*"<<endl;
                else
                    cout<<ans<<endl;
            }
        }
        return 0;
    
    }

     今天实验室整座楼都白花花的,到处的墙都在被粉刷,空气里弥漫着甲醛的味道,不禁感叹18级小学妹福利真好。

    我也想当个粉刷匠,这样就不用集训了啊哈!~

  • 相关阅读:
    一步步学习MDL[3]
    一步步学习MDL[0]
    .net下ckeditor+ckfinder+SyntaxHighlighter三集成demo
    页面跳转如何进入一个嵌套在Iframe中的页面中
    解决iframe,div在移动设备上实现局部刷新的方法
    SQL三种东西永远不要放到数据库里
    悟透JavaScript
    Js 常用日期汇总
    js_兼容IE和FF
    SQL中字符串类型转换为时间类型
  • 原文地址:https://www.cnblogs.com/kepa/p/9439077.html
Copyright © 2020-2023  润新知