10月集训test6

来源:互联网 发布:北京软件定制开发 编辑:程序博客网 时间:2024/06/09 23:11

嗯喵 test6 算是一个不错的进步,A了两道题的感觉不是一般的好。
不过也可能是这次的题比较简单?^_^

1.机器

豆豆家里有一个万能的机器,豆豆想让这个机器帮他做作业。但是这个机器本身有一些任务需要完成,等到空闲的时候才能帮豆豆完成作业。
这个机器效率很高,完成任何任务都只需要一个单位的时间。
机器工作表上有 n 个任务,机器在 ti 时间开始执行第i个任务。
现在豆豆有 m 个询问,每个询问有一个数字 q ,表示如果在 q 时间把作业交给机器,何时这个机器才开始做作业。
机器总是按照时间顺序执行工作表,当机器空闲时立即帮豆豆做作业。m 个询问之间是无关的。

输入格式

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

输出格式

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

样例数据

输入
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互不相同。

首先先输入机器执行任务的时间,预处理出它有哪些时间是空闲的。然后把之前的所有事都挪在这一刻来做,就酱。

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>using namespace std;int n,m,x;int c[200010];bool a[200010];inline int read(){    int i=0,f=1;    char c;    for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());    if(c=='-') f=-1,c=getchar();    for(;c>='0'&&c<='9';c=getchar()) i=(i<<3)+(i<<1)+c-'0';    return i*f;}int main(){    //freopen("machine.in","r",stdin);    //freopen("machine.out","w",stdout);    memset(a,false,sizeof(a));    n=read(),m=read();    for(int i=1;i<=n;++i)    {        x=read();        a[x]=true;    }    for(int i=200005;i>=1;i--)    {        if(!a[i])             c[i]=i;        else             c[i]=c[i+1];    }    for(int i=1;i<=m;++i)    {        x=read();        cout<<c[x]<<endl;    }    return 0;   }

2.立方数

豆豆还是觉得自己智商太低了,就又去做数学题了。一看到题,他就觉得自己可能真的一点智商都没有。便哭着跑来像 dalao 求教:
如果存在正整数 A,B ,满足 A3 - B3 = x ,则称质数 x 为立方数。现在给你一个质数 x ,请判断是不是立方数,如果是请输出 “YES” ,否则输出 “NO” 。

输入格式

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

输出格式

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

样例数据

输入
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≤10^12。
【思考】
如果是以下数据范围,怎么做?
对于 100% 的数据,T≤100000;1≤x≤10^12。

看破红尘的人一声冷笑。
这,是,计,算,机,题,吗。。。。。摔!!!明,明,是,数,学,题。。。。。。所以为什么要管复杂度,不,是,一,样,的,吗。。。
首先,咳,a^3-b^3=(a^2+ab+b^2)(a-b),因为x为质数,则(a^2+ab+b^2)(a-b)一个肯定是1,另一个是x本身。又a,b都是正整数,所以(a^2+ab+b^2)一定不为1。
a-b=1,a^2+ab+b^2=x
a^2+ab+b^2=(a-b)^2+3ab
x-1必为3的倍数,首先排除一部分。
然后由ab=(x-1)/3解出ab的值,再根据(a-b)^2=1,算出(a+b)^2的值。
若是平方开方后所得的为整数,则有解,否则无解。

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>using namespace std;int t;long long x,ab;int main(){    //freopen("cube.in","r",stdin);    //freopen("cube.out","w",stdout);    cin>>t;    while(t--)    {        cin>>x;        if((x-1)%3==0)        {            ab=(x-1)/3;            long long aa=1+4*ab;            double xx=sqrt(aa);            if(xx-(int)xx/1==0)                cout<<"YES"<<endl;            else                cout<<"NO"<<endl;        }        else            cout<<"NO"<<endl;    }    return 0;}

3.长跑路径

企鹅豆豆即将要去考长跑了,但是作为一只企鹅,长跑自然比不过鸵鸟和鸡。为了公平起见,教练告诉豆豆,他可以从 K 个指定地点中选择两个不同的地点分别作为起点和终点来考试。
考试地图是一个由 N 个点 M 条边组成的没有重边和自环的连通无向图,一条边的长度为 Ai 。
豆豆想知道他的长跑考试最少需要跑多远。

输入格式

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

输出格式

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

样例数据

输入
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最短路一阵乱搞。。。。。
据说应该卡掉但不知道为什么过了。。。。

#include<iostream>#include<cstdlib>#include<cstdio>#include<cstring>#include<string>#include<ctime>#include<cmath>#include<algorithm>#include<cctype>#include<iomanip>#include<queue>#include<vector>#define ll long longusing namespace std;int getint() {    int i=0,f=1;char c;    for(c=getchar();(c<'0'||c>'9')&&c!='-';c=getchar());    if(c=='-')c=getchar(),f=-1;    for(;c>='0'&&c<='9';c=getchar())i=(i<<3)+(i<<1)+c-'0';    return i*f;}const int N=100005;const ll INF=1e17; int t,n,m,k;int tot,first[N],next[N<<1],to[N<<1],w[N<<1];ll dis[N],f[N],dis1[N],dis2[N],ans;int key[N];priority_queue<pair<ll,int> >q;inline void add(int x,int y,int z){    next[++tot]=first[x];    first[x]=tot;    to[tot]=y;    w[tot]=z;}void dfs(int u,int fa){    if(key[u])        dis1[u]=dis[u];    for(int e=first[u];e;e=next[e])    {        int v=to[e];        if(v!=fa)        {            dis[v]=dis[u]+w[e];            dfs(v,u);            if(dis1[v]<dis1[u])                dis2[u]=dis1[u],dis1[u]=dis1[v];            else if(dis1[v]<dis2[u])                    dis2[u]=dis1[v];        }    }    f[u]=dis1[u]+dis2[u]-2*dis[u];}void dp(){    for(int i=1;i<=n;i++)        dis[i]=0,dis1[i]=dis2[i]=INF;    dfs(1,0);    for(int i=1;i<=n;i++)        ans=min(ans,f[i]);    cout<<ans<<endl;}void dijkstra(int s){    for(int i=1;i<=n;i++)dis[i]=INF;    while(!q.empty())        q.pop();    dis[s]=0;    q.push(make_pair(0,s));    while(!q.empty())    {        int u=q.top().second;        q.pop();        if(u!=s&&key[u])        {            ans=min(ans,dis[u]);            break;        }        for(int e=first[u];e;e=next[e])        {            int v=to[e];            if(dis[u]+w[e]<dis[v])            {                dis[v]=dis[u]+w[e];                q.push(make_pair(-dis[v],v));            }        }    }}int main(){    //freopen("path.in","r",stdin);    //freopen("path.out","w",stdout);    int x,y,z;    t=getint();    while(t--)    {        n=getint(),m=getint();        tot=0;        ans=INF;        for(int i=1;i<=n;i++)            first[i]=key[i]=0;        for(int i=1;i<=m;i++)        {            x=getint(),y=getint(),z=getint();            add(x,y,z),add(y,x,z);            ans=min(ans,1ll*z);        }        k=getint();        for(int i=1;i<=k;i++)            x=getint(),key[x]=1;        if(k==n)        {            cout<<ans<<endl;            continue;        }        ans=INF;        if(m==n-1)        {            dp();            continue;        }        for(int i=1;i<=n;i++)            if(key[i])                dijkstra(i);        cout<<ans<<endl;    }    return 0;}

最近天气还好,喵呜~

来自2017.10.14.

——我认为return 0,是一个时代的终结。