zoukankan      html  css  js  c++  java
  • 套题T2

    数学(math.cpp)

    DXY的数学很差。。。

    对于所有1<=i<=N求(2^i – i^2)能被7整除的个数。(N<=1000000)

    样例输入:

    3

    样例输出:

    1


     你在代码中输入一个int范围内的数字的时候

    其实系统是默认把他装到一个int变量里去参加运算
    如果你用int去mod longlong

    mod出来的是个int

    所以我们在数字后加上ll来表示强行把这个数字转成ll 
     
    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define LiangJiaJun main
    using namespace std;
    int kk[4]={2,4,1},ans=0;long long n;
    int LiangJiaJun(){
        cin>>n;
        for(long long i=1;i<=n;i++){
            long long x=(kk[(i-1)%3LL]+7LL-((i*i)%7LL))%7LL;
            if(x==0){
                ++ans;
            }
        }
        cout<<ans<<endl;
        return 0;
    }
    View Code

    考虑到N可能很大,模拟一下2^i的情况,可以得到kk数组

    +7LL有两个点

    1.7默认是int,LL后缀默认long long不会溢出

    2.7防止取余出现负数

    由于都是对7取模,我们可以分步取模

    发现2^i对7取模有规律,只要i^2对7取模与其相等就得解


    面包(bread.cpp)

    DXY想在一些城市之间开一家面包店。

    面包店必须要和小麦店连通,但是这些城市中有小麦店的城市只有K个,很坑的是DXY不喜欢在有小麦店的城市开面包店。一共有n个城市,m条双向路径,K个城市有小麦店。求面包店和小麦店的最短距离是多少。(不能开店的话输出-1)

    第一行:n,m,k

    第二行到第m+1行,m条路径,u,v,w(表示从u城市到v城市有一条长度为w的边)

    第三行一共k个数,表示有小麦店的城市的编号。

    样例:

    输入:

    5 4 2
    1 2 5
    1 2 3
    2 3 4
    1 4 10
    1 5

    输出:

    3

    输入:

    3 1 1
    1 2 3
    3

    输出:

    -1


    刚开始想写spfa 后来觉得……

    因为只有开店和小麦2种店
    不存在经过2条路的最短路
    最短路一定是直连的
    用f数组来存是不是小麦店 最早的时候全部赋值0代表不是小麦 读入的时候改成1表示是小麦店
    然后就只需要遍历每一条边
    如果他们的2个端点满足一个小麦一个开店就可能成为最短
    每次更新ans  然后输出就完了
    于是就不需要存图 开个二维数组就完了
    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<queue>
    #define maxn 100005
    #define qaq 0xfffffff
    using namespace std;
    
    int ans=qaq;
    int n,m,k;//<=100000
    int xiaomai;
    int f[maxn];
    int QAQ[maxn][3];
    
    int main()
    {
        memset(f,0,sizeof(f));
        cin>>n>>m>>k;
        for(int i=1;i<=m;++i)
        {
            scanf("%d%d%d",&QAQ[i][0],&QAQ[i][1],&QAQ[i][2]);//A B W
        }
        for(int i=1;i<=k;++i)
        {
            scanf("%d",&xiaomai);
            f[xiaomai]=1;
        }
        for(int i=1;i<=m;++i)
        {
            if(f[QAQ[i][0]]!=f[QAQ[i][1]])
            {
                ans=min(ans,QAQ[i][2]);
            }
        }
        if(ans==qaq)puts("-1");
        else printf("%d
    ",ans);
        return 0;
    }
    View Code

    dq(dq.cpp)

    给定一个数列a[1],a[2],a[3]…a[n],每次操作将数列的最后一个数字放到数列的第一位,问是否存在一种操作,使得操作之后数列变为一个不下降序列。最少的操作数是多少。不存在就输出-1

    样例输入

    2
    2 1

    样例输出

    1

    样例输入

    3
    1 3 2

    样例输出

    -1

    样例输入

    2
    1 2

    样例输出

    0


     先判断最后一个是不是小于等于第一个,如果不是就有两种情况

    ①如果是的话,就从后面往前面搬,找到第一个不满足条件的,截取然后搬过去,检验一下前面那一段和后面那一段是不是都是不下降的,并且最后一个小于等于第一个

    ②原序列本就是不下降的

    然后判断一下就完啦

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define LiangJiaJun main
    #define INF 1999122700
    using namespace std;
    int n,a[200004],k,l,r,mint=INF,maxn=0;
    int LiangJiaJun(){
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%d",&a[i]);
            mint=min(mint,a[i]);
            maxn=max(maxn,a[i]);
        }
        for(int i=1;i<=n;i++)a[i+n]=a[i];
        l=n+1;r=n+n;int ans=0;
        while(l>0&&r>n){
            if(a[l]==mint&&a[r]==maxn){
                bool q=0;
                for(int i=l;i<r;i++){
                    if(a[i]>a[i+1]){
                        q=1;break;
                    }
                }
                if(!q)return printf("%d
    ",ans),0;
            }
            --l;--r;++ans;
        }
        puts("-1");
        return 0;
    }
    View Code
  • 相关阅读:
    系统维护-安全-测试等方面的开源项目
    linux命令学习
    Rancher + k8s + docker 部署资料
    个人java框架 技术分析
    java十年,需要学会的Java开发体系
    IdentityServer4 经典文章
    .net core 资料网站 和 开源项目
    Java 学习资料网站集合
    spring cloud资料汇总
    秦九韶公式 【多项式】
  • 原文地址:https://www.cnblogs.com/gc812/p/5814973.html
Copyright © 2011-2022 走看看