我是一个粉刷匠

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

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

赶了半个小时终于赶跑了,又睡不着,就索性破罐子破摔玩起了狼人杀,玩到凌晨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级小学妹福利真好。

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

猜你喜欢

转载自www.cnblogs.com/kepa/p/9439077.html