*TEST 6 for NOIP + NOIP初赛

头更更大

这个10月完就要去搞NOIP了。。。

10月30天也就3次测试。。。为保佑进省一我还是每次测试玩都写个总结。。


boomshakalaka。。。诶好像没炸只是第三题太坑了。。。
第一题第二题。。。送分的不解释。。所以说我虽然200多却排在十多名后了。。。

TEST 6 for NOIP(200/300)

机器(100/100)

题目描述
豆豆家里有一个万能的机器,豆豆想让这个机器帮他做作业。但是这个机器本身有一些任务需要完成,等到空闲的时候才能帮豆豆完成作业。

这个机器效率很高,完成任何任务都只需要一个单位的时间。

机器工作表上有 n 个任务,机器在 ti 时间开始执行第i个任务。

现在豆豆有 m 个询问,每个询问有一个数字 q ,表示如果在 q 时间把作业交给机器,何时这个机器才开始做作业。

机器总是按照时间顺序执行工作表,当机器空闲时立即帮豆豆做作业。m 个询问之间是无关的。

输入格式
第一行有两个数字 n, m ,表示工作表里面有 n 个任务, 有 m 个询问;
第二行有 n 个不同的数字 t1, t2, t3,….tn ,表示机器在 ti 时间执行第 i 个任务。
接下来 m 行,每一行有一个数字 q ,豆豆的一个询问。

输出格式
每个询问输出一个整数表示机器开始做作业的时间。

样例数据 1
输入  [复制]

5 5
1 2 3 5 6
1
2
3
4
5
输出

4
4
4
4
7
备注
【数据范围】
对于 80% 的数据,n,m≤1000;1≤ti≤1000;1≤q≤1000;
对于 100% 的数据,1≤n,m≤100000;1≤ti≤200000;1≤q≤200000;ti互不相同。

MY/STD.CPP

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;

const int kkk=210000;
int n,m,t,q,k;
int a[kkk];

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    cin >> n >> m;
    for(int i=1;i<=n;i++){cin>>t;a[t]=1;}
    int cnt=kkk+1;
    for(int i=kkk;i>=0;i--)
    {
        if(!a[i])cnt=i;
        a[i]=cnt;
    }
    for(int i=1;i<=m;i++)
    {cin >> q;cout<<a[q]<<endl;}
}

立方数(100/100)

题目描述
豆豆还是觉得自己智商太低了,就又去做数学题了。一看到题,他就觉得自己可能真的一点智商都没有。便哭着跑来像 dalao 求教:

如果存在正整数 A,B ,满足 A3 - B3 = x ,则称质数 x 为立方数。现在给你一个质数 x ,请判断是不是立方数,如果是请输出 “YES” ,否则输出 “NO” 。

输入格式
第一行一个整数 T 表示数据组数;
接下来 T 行,每行一个数字 x ;

输出格式
输出 T 行表示每个问题的答案。

样例数据 1
输入  [复制]

10
2
3
5
7
11
13
17
19
23
29
输出

NO
NO
NO
YES
NO
NO
NO
YES
NO
NO
备注
【数据范围】
对于 40% 的数据,如果有解 A 在 10000 以内;
对于 100% 的数据,T≤1000;1≤x≤1012。

【思考】
如果是以下数据范围,怎么做?
对于 100% 的数据,T≤100000;1≤x≤1012。

STD.CPP

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
using namespace std;

inline int read()
{
    int X=0,w=1; char ch=0;
    while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
    return X*w;
}

inline void write(int x)
{
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
}

int t;
long long x;

bool judge(long long x)
{
    long long jud1 = (x-1)/3;
    if(3*jud1+1!=x)return false;

    long long jud2 = sqrt(1+4*jud1);
    if(jud2*jud2!=1+4*jud1)return false;

    if(jud2%2!=1)return false;

    //cout << (jud2+1)/2 << " " << (jud2-1)/2 << endl;
    return true;
}

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    cin >> t;
    while(t--)
    {
        cin>>x;
        cout<<((judge(x))?("YES"):("NO"))<<endl;
    }
}

长跑路径

题目描述
企鹅豆豆即将要去考长跑了,但是作为一只企鹅,长跑自然比不过鸵鸟和鸡。为了公平起见,教练告诉豆豆,他可以从 K 个指定地点中选择两个不同的地点分别作为起点和终点来考试。

考试地图是一个由 N 个点 M 条边组成的没有重边和自环的连通无向图,一条边的长度为 Ai 。

豆豆想知道他的长跑考试最少需要跑多远。

输入格式
第一行一个整数 T 表示数据组数;
每组数据第一行两个整数 N,M 表示点数和边数。
接下来 M 行每行三个数 U,V,A 表示从 U 到 V 有一条长度为 A 的路径。
接下来一行一个整数 K 表示可选地点个数。
接下来一行 K 个互不相同的整数表示可选地点的编号。

输出格式
对于每组数据输出一个整数表示答案。

样例数据 1
输入  [复制]

1
5 6
1 2 1
2 3 3
3 1 3
2 5 1
2 4 2
4 3 1
3
1 3 5
输出

2
备注
【数据范围】
对于 30% 的数据,K≤4;
对于另外 10% 的数据,K=N;
对于另外 30% 的数据,M=N-1;
对于 100% 的数据,1≤N,M≤100000;T≤5;1≤K≤n;1≤边长≤100000。

题解。。方法略神奇。。。
好像是用二进制码标号分组再跑两遍Dijkstra???我再看看。
下面是参考的DZY神犇的代码:

STD.CPP

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;

long long read()
{
    long long X=0,w=1; char ch=0;
    while(ch<'0' || ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0' && ch<='9') X=(X<<3)+(X<<1)+ch-'0',ch=getchar();
    return X*w;
}

const int kkk=100500;
#define pii pair<int,long long>

priority_queue< pair<long long,int> >que;
int n,m,k,ki[kkk],pos[kkk];
long long ans,dis[kkk];
vector<pii>side[kkk];

int main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);std::cout.tie(0);

    for(int t=read(),tt=1;tt<=t;++tt)
    {
        n = read();     m = read();
        for(int i=1;i<=n;i++)side[i].clear();
        for(int i=1;i<=m;i++)
        {
            int u=read(),v=read();
            long long val=read();
            side[u].push_back(make_pair(v,val));
            side[v].push_back(make_pair(u,val));    
        }

        k = read();
        memset(pos,0,sizeof(pos));

        for(int i=1;i<=k;i++)ki[i]=read(),pos[ki[i]]=i;
        ans = 0x3f3f3f3f3f3f3f3f;

        //如果针对每个点的话复杂度是 m + n log n 的
        //而如果进行分组的话复杂度是 logK*M 的。 
        //相当于被卡的没有办法了 
        for(int j=0;(1<<j)<=k;j++)//二进制枚举 k(个数) 的每一位 ,对编号进行二进制枚举。
        {
            memset(dis,127,sizeof(dis));
            while(!que.empty())que.pop();
            for(int i=1;i<=k;i++)if(i&(1<<j))//010 & 111 = 010 = bool(1); 010 & 101 = 0 = bool(0);
                dis[ki[i]]=0,que.push(make_pair(0,ki[i]));//因为每一个不同的数的二进制位总有一位不同。 

            while(!que.empty())
            {
                int u=que.top().second; que.pop();

                if(pos[u]&&!(pos[u]&(1<<j)))//pos[u]说明我们这是要找的点之一,!(pos[u]&(1<<j))说明这不是起点。 
                    {ans=min(ans,dis[u]);break;}

                for(int i=side[u].size()-1;i>=0;i--)
                {
                    int v=side[u][i].first;
                    long long val=side[u][i].second;

                    if(dis[v]>dis[u]+val)
                    {
                        dis[v] = dis[u] + val;
                        que.push(make_pair(-dis[v],v));
                    }
                }
            }
        }
        cout << ans << endl;
    }
}

而且他这次还AK了。。。
这里写图片描述(话说这个 QQ表情包怎么这么。。额)

感想

今天停更(哈?)

特别感谢!

特别感谢今天来参加了信息竞赛初赛的同学!!!没有你们的付出我们@宿正蒙 @天府•吴咏蔚 @何凌岳 还不一定过的了初赛。非常感谢!!!期待我们光棍节(。。哪里不对)胜利归来的好消息!!!
下面感谢名单:
@CF @杨兰隽怡 @唐浩迪 @尹智瑜 @蔡依芸@康竣泓 @许瑞杰 @啦啦 @姚杰
@石颖@陈思妙@王煜@王厚元@汤宇阳@刘佳璇@王婧霖@唐佳宁@王玥@吴虹萱@夏海鑫@范卓琳@张荣杰@杨依玮@周千荷@柏明峰(话说我怎么还没加那么多人的QQ…)

从QQ空间拖来的 o( ̄︶ ̄ *)o。。

加个UTbuff:

border="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&id=39224659&auto=1&height=66">

11月12日再见!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值