zoukankan      html  css  js  c++  java
  • 2018.8.8 模拟赛

    T1:
    Time Limits: 2000 ms Memory Limits: 262144 KB Detailed Limits

    Description

     MWH寒假外出旅游,来到了S国。S国划分为N个省,第i个省有Ti座城市,编号分别为Ci1,Ci2,……CiTi(各省城市编号不会重复)。所有城市间有M条双向的道路连接,从任意一个城市出发,可到达一切城市,每条道路均须收费。
     此时恰逢春运期间,S国交通运输局采取了优惠措施。当一条路的路费在[L..R]区间时,可免去。同时,每个省也有优惠措施,第i个省内的每条道路路费收其Xi%,连接第i个省和第j个省的每条道路路费收其(Xi%+Xj%)/2。
    

    MWH想从城市s走到城市t,请求出一对L,R,确保:

    MWH能免费到达目的地;
    L≤R;
    L、R均为整数;
    L尽可能地大,R在满足L最大的前提下最小。

    注意:因每条道路由各省的交通运输局直接管辖,所以每条道路的路费必须先得到省级优惠,再得到国家级优惠。

    Input

    第一行两个整数N,M。
    接下来M行,每行三个整数,u、v、w,表示连接u、v的道路需收费w。
    接下来N行,第i+M+1行有一个整数Ti,后面Ti个整数,分别是Ci1..CiTi(所有城市编号保证按正整数顺序给出1.. Ti)。
    下一行N个整数X1..Xi。
    最后一行,两个整数,s、t。

    Output

    一行两个整数,如题,L和R。

    Sample Input

    3 7
    1 2 3
    5 2 8
    1 3 7
    5 4 5
    2 4 9
    3 5 10
    3 4 2
    2 1 2
    1 3
    2 4 5
    30 50 60
    1 5

    Sample Output

    2 6

    解题思路

    二分+最短路,二分L与R,然后spfa时判断。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<algorithm>
    #include<cstring>
    #include<queue>
    
    using namespace std;
    const int MAXN = 50005;
    const int MAXM = 100005;
    
    int n,m,head[MAXN],cnt,bl[MAXN];
    int to[MAXM<<1],nxt[MAXM<<1],val[MAXM<<1];
    int ans,l,r,X[5005],S,T,L,R;
    double dis[MAXN];
    bool vis[MAXN];
    queue<int> Q;
    
    inline int rd(){
        int x=0,f=1;char ch=getchar();
        while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();}
        while(isdigit(ch))  {x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}
        return x*f;
    }
    
    inline void add(int bg,int ed,int w){
        to[++cnt]=ed,nxt[cnt]=head[bg],val[cnt]=w,head[bg]=cnt;
    }
    
    inline bool check(int Mid){
        memset(vis,false,sizeof(vis));
        for(register int i=1;i<=50000;i++) dis[i]=1e9;
        dis[S]=0;vis[S]=1;Q.push(S);
        while(Q.size()){
            int x=Q.front();Q.pop();vis[x]=0;
            for(register int i=head[x];i;i=nxt[i]){
                int u=to[i];
                double now=(double)val[i]*(double)(X[bl[x]]+X[bl[u]])/200;
                if(now>=Mid) now=0;
                if(dis[x]+now<dis[u]){
                    dis[u]=dis[x]+now;
                    if(!vis[u]){
                        vis[u]=1;
                        Q.push(u);
                    }
                }
            }
        }
        if(dis[T]!=0) return false;
        return true;
    }
    
    inline bool check2(int Mid){
        memset(vis,false,sizeof(vis));
        for(register int i=1;i<=50000;i++) dis[i]=1e9;
        dis[S]=0;vis[S]=1;Q.push(S);
        while(Q.size()){
            int x=Q.front();Q.pop();vis[x]=0;
            for(register int i=head[x];i;i=nxt[i]){
                int u=to[i];
                double now=(double)val[i]*(double)(X[bl[x]]+X[bl[u]])/200;
                if(now<=Mid && now>=L) now=0;
                if(dis[x]+now<dis[u]){
                    dis[u]=dis[x]+now;
                    if(!vis[u]){
                        vis[u]=1;
                        Q.push(u);
                    }
                }
            }
        }
        if(dis[T]!=0) return false;
        return true;
    }
    
    
    int main(){
        freopen("trip.in","r",stdin);
        freopen("trip.out","w",stdout);
        n=rd();m=rd();
        for(register int i=1;i<=m;i++){
            int x=rd(),y=rd(),z=rd();
            add(x,y,z);add(y,x,z);
            r=max(r,z);
        }
        for(register int i=1;i<=n;i++){
            int x=rd();
            for(register int j=1;j<=x;j++) bl[rd()]=i;
        }
        for(register int i=1;i<=n;i++) X[i]=rd();
        S=rd();T=rd();int pr=r;
        while(l<=r){
            int mid=l+r>>1;
            if(check(mid)) {
                L=mid;
                l=mid+1;
            }
            else r=mid-1;
        }
        r=pr;
        while(l<=r){
            int mid=l+r>>1;
            if(check2(mid)){
                R=mid;
                r=mid-1;
            }
            else l=mid+1;
        }
        cout<<L<<" "<<R<<endl;
        return 0;
    }

    T3
    Time Limits: 1000 ms Memory Limits: 262144 KB Detailed Limits
    Goto ProblemSet

    Description

      话说, 小X是个数学大佬,他喜欢做数学题。有一天,小X想考一考小Y。他问了小Y一道数学题。题目如下:
      对于一个正整数N,存在一个正整数T(0<T<N),使得
    

    的值是正整数。
    小X给出N,让小Y给出所有可能的T。如果小Y不回答这个神奇的大佬的简单数学题,他学神的形象就会支离破碎。所以小Y求你帮他回答小X的问题。

    Input

      一个整数N。
    

    Output

      第一个数M,表示对于正整数N,存在M个不同的正整数T,使得
    

    是整数。
    后面是M个数,每一个数代表可能的正整数T(按从小到大的顺序排列)。

    Sample Input

    Sample Input1:
    1

    Sample Input2:
    3

    Sample Input3
    180

    Sample Output

    Sample Output
    0

    Sample Output
    1 2

    Sample Output
    5 120 144 160 168 176

    Data Constraint

      对于5%的数据,N=1.
      对于20%的数据,N<=5.
      对于40%的数据,N<=1000000
      对于另外20%的数据,答案只有1个,且N为质数,保证对于前60%的数据,当N为质数的时候,答案都一定只有一个,对于这20%的数据,满足2<N。
      对于80%的数据,N<=10^9.
      对于100%的数据,N<=10^14.
    

    解题思路

    设原式=k,然后变形可得 t=n*((2*k-2)/(2*k-1)) ,因为分子分母互质,所以必须使2*k-1是n的约数,所以只需要筛出n的奇数约数。

    代码

    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    
    using namespace std;
    typedef long long LL;
    
    LL n,ans[5000005];
    LL a[5000005];
    int cnt,cnt2;
    
    int main(){
        freopen("math.in","r",stdin);
        freopen("math.out","w",stdout);
        scanf("%lld",&n);
        for(register int i=1;(LL)i*i<=n;i++)
            if(n%i==0){
                if(i&1) a[++cnt]=i;
                if(n/i!=i && (n/i)&1) a[++cnt]=n/i; 
            }
        sort(a+1,a+1+cnt);
        for(register int i=2;i<=cnt;i++)
            ans[++cnt2]=n/a[i]*(a[i]-1);
        printf("%d ",cnt2);
        for(register int i=1;i<=cnt2;i++) printf("%lld ",ans[i]);
        return 0;
    }
  • 相关阅读:
    DirectSound学习笔记(7):缓冲区操作
    Firebird MsSQL Data Types比较
    插座上的Linux充电器.不..Marvell Plug Computer
    ASP.NET / 学习asp.net比较完整的流程
    P2P穿透UDP/TCP原理
    在C#中利用ActiveX控件进行视频采集
    ffmpeg快速命令使用
    Win7上帝模式
    DirectSound学习笔记(3):协作级别
    自己写的一个asp.netcookies购物车类
  • 原文地址:https://www.cnblogs.com/sdfzsyq/p/9676899.html
Copyright © 2011-2022 走看看