• 周练1


    7-1 N个数求和

    写了蛮久 我做水题的能力太差了  明天得把周练题目全部a了 

    还是有一个超时

    #include <bits/stdc++.h>
    
    using namespace std;
    
    
    long gvs(long a,long b);
    int main()
    {
    
        int n;cin>>n;
    
        long a[105][2];
        for(int i=1;i<=n;i++)
         {
             scanf("%ld/%ld",&a[i][0],&a[i][1]);//printf("1:%d/%d
    ",a[i][0],a[i][1]);
         }
    
         for(int i=1;i<=n-1;i++)
         {
             int g=gvs(a[i][1],a[i+1][1]);
            //  printf("g=%d
    ",g);
    
             a[i+1][0]=a[i+1][0]*(g/a[i+1][1]); //printf("%d
    ",a[i+1][0]);
             a[i][0]=a[i][0]*(g/a[i][1]); //printf("%d
    ",a[i][0]);
             a[i+1][0]+=a[i][0];//printf("%d
    ",a[i+1][0]);
             a[i+1][1]=g;//printf("%d
    ",a[i+1][1]);
    
         }
    
    
    
    //printf("%d/%d
    
    ",a[n][0],a[n][1]);
    int f=0;
    if(a[n][0]<0){f=1;printf("-");a[n][0]=-a[n][0];}
    if(a[n][0]==0)printf("0");
     long num=a[n][0]/a[n][1];
     a[n][0]%=a[n][1];
      if(num!=0&&a[n][0]!=0) printf("%d ",num);
      else if(num!=0)printf("%d",num);
     if(a[n][0]!=0)
     {
         for(int i=a[n][0];i>0;i--)
         {
             if(a[n][0]%i==0&&a[n][1]%i==0){if(f)printf("-"); printf("%ld/%ld",a[n][0]/i,a[n][1]/i); break;}
         }
    
    
    
     }
    
    
    
    
    
    
    
    
        return 0;
    
    }
    
    long gvs(long a,long b)
    {
        if(a>b){int t=a;a=b;b=t;}
    
        for(long i=a;;i+=a)
        {
            if(i%a==0&&i%b==0)return i;
    
        }
    
    
    
    }
    View Code

    看了别人的  最大公约数辗转相除  快了很多

    并且边读边处理更加好

    #include <stdio.h>
     
    long long gcd(long long a,long long b)//求最大公约数。
    {
        if(a == 0)
            return 0;
        else
            return (b == 0) ? a : gcd(b, a % b);
    }
     
    int main()
    {
        int N;
        long long lcp;//用以记录最小公倍数
        long long a,b,c,d;
        int i = 1;
        scanf("%d",&N);
        scanf("%lld/%lld",&a,&b);
        int t0 = gcd(a,b);
        if(a)
        {
            a /= t0;
            b /= t0;
        }
     
        while(i < N)
        {
            scanf("%lld/%lld",&c,&d);
            lcp = b / gcd(b,d) * d;//通过最大公约数换算出两个分母的最小公倍数
            a = a * lcp / b + c * lcp / d;//通分后分子和
            b = lcp;
            int t0 = gcd(a,b);
            if(t0 != 0)//从扩大最小公倍数之后的形式变换回来
            {
                a = a / t0;
                b = b / t0;
            }
            i++;
        }
        if(a && a/b == 0)/// 整数部分为0 且 a不为 0
            printf("%lld/%lld
    ",a%b,b);
        else if(a%b == 0)/// 小数部分为0
            printf("%lld
    ",a/b);
        else
            printf("%lld %lld/%lld
    ",a/b,a%b,b);
        return 0;
    }
    View Code

    7-3 A-B  

    本题要求你计算AB。不过麻烦的是,A和B都是字符串 

    自己写1: 有一个点超时

    #include <bits/stdc++.h>
    
    using namespace std;
    
    
    
    int main()
    {
    
    string s,a;
    getline(cin,s);
    getline(cin,a);
    for(int i=0;i<a.size();i++)
    {
        for(int k=0;k<s.size();k++)
        {
            if(a[i]==s[k])
            {
    
                for(int j=k;j<s.size();j++)
                {
    
                 s[j]=s[j+1];}
                 k--;
    
                }
    
        }
    
    
    }
    cout<<s;
    
    
    
    return 0;
    }
    View Code

    想到向量 过了    最好不要map<char,int> char就是int

    #include <bits/stdc++.h>
    
    using namespace std;
    
    
    
    int main()
    {
    
    string s,a;
    getline(cin,s);
    getline(cin,a);
    vector<char>ans;
    map<int,int>m;
    for(int i=0;i<a.size();i++)
    {
        m[a[i]]=1;
    
    }
    
    for(int i=0;i<s.size();i++)
    {
        if(m[s[i]]!=1)ans.push_back(s[i]);
    
    }
    
    //printf("%d",ans.size());
    for(int i=0;i<ans.size();i++)
        cout<<ans[i];
    
    
    
    
    
    return 0;
    }
    View Code

    7-9 集合相似度

    用了三个set 所以有一个点超时了  

    #include <bits/stdc++.h>
    
    using namespace std;
    
    
    
    
    set<long>a[60];
    int main()
    {
    set<long>s;
    int n;cin>>n;long x;
    for(int i=1;i<=n;i++)
    {  int c;
       cin>>c;
       for(int k=1;k<=c;k++)
            {cin>>x;a[i].insert(x);}
    
    
    }
    int k;cin>>k;int q,w;
    int c[2000][2];
    for(int i=1;i<=k;i++)
    {
        cin>>c[i][0]>>c[i][1];
    }
    
    
    for(int i=1;i<=k;i++)
    {  s.clear();
        q=c[i][0];w=c[i][1];
        int n1=a[q].size()+a[w].size();
        for (set<long>::iterator it = a[q].begin(); it != a[q].end(); ++it)
         {
            s.insert(*it);
         }
         for (set<long>::iterator it = a[w].begin(); it != a[w].end(); ++it)
         {
             s.insert(*it);
         }
    
            int n2=s.size();
        printf("%.2lf%%
    ",100.0*(n1-n2)/n2);
    
    }
    
    
    
    
    
    return 0;
    }
    View Code

     优化了代码  很多时候不一定要对两个进行操作  对一个就行了 可以变读入边输出 省下一个C数组

    #include <bits/stdc++.h>
    
    using namespace std;
    
    
    
    
    set<long>a[60];
    int main()
    {
    set<long>s;
    int n;cin>>n;long x;
    for(int i=1;i<=n;i++)
    {  int c;
       scanf("%d",&c);
       for(int k=1;k<=c;k++)
            {scanf("%ld",&x);a[i].insert(x);}
    
    
    }
    int k;cin>>k;int q,w;
    
    
    
    for(int i=1;i<=k;i++)
    {  s.clear();
        scanf("%d%d",&q,&w);
    
        int n1=a[q].size()+a[w].size();int c=0;
        for (set<long>::iterator it = a[q].begin(); it != a[q].end(); ++it)
         {
            if(a[w].count(*it))c++;
         }
    
    
        printf("%.2lf%%
    ",100.0*(c)/(n1-c));
    
    }
    
    
    
    
    
    return 0;
    }
    View Code
     
  • 相关阅读:
    Unity3D屠龙战机项目总结
    10.2 MySQL数据库安装
    10.1 JDBC基础
    9.5 异常处理规则
    9.4 Java的异常跟踪栈
    9.3 使用throw抛出异常
    9.2 Checked异常和Runtime异常
    9.1 异常处理机制
    8.5 泛型和数组
    8.5 擦除和转换
  • 原文地址:https://www.cnblogs.com/bxd123/p/10177142.html
Copyright © 2020-2023  润新知