zoukankan      html  css  js  c++  java
  • 周练2

    7-11 正整数A+B

    这种水题都做了好久  还是有一个没过 不知道为什么  下次重新编

    #include <bits/stdc++.h>
    
    using namespace std;
    
    
    
    
    int main()
    {
    
    string s;
    getline(cin,s);
    int fa=1,fb=1;int a=0,b=0;
    int i;
    //if(s[0]==' ')fa=0;
    for( i=0;s[i]!=' ';i++)
    {
      //printf("%d
    ",s[i]-'0');
        if(i==0&&s[i]=='0')fa=0;
        if(!((s[i]-'0')<=9&&(s[i]-'0')>=0)){fa=0;}
        else a=a*10+s[i]-'0';
    
    }
    for(int k=i+1;s[k]!=' '&&s[k]!='';k++)
    {
         // printf("%d ",s[k]-' ');
         if(k==i+1&&s[k]=='0')fb=0;
        if(!((s[k]-'0')<=9&&(s[k]-'0')>=0)){fb=0;break;}
        else b=b*10+s[k]-'0';
    }
    if(a>1000||a==0)fa=0;
    if(b>1000||b==0)fb=0;
    
    
    if(fa)printf("%d",a);
    else printf("?");
    printf(" + ");
    if(fb)printf("%d",b);
    else printf("?");
    printf(" = ");
    if(fa&&fb)printf("%d",a+b);
    else printf("?");
    
    
    
    
    
    return 0;
    }
    View Code

    看到一个比较好的方法

    #include<iostream>
    #include<string>
    using namespace std;
    int main()
    {
        string a;
        getline(cin, a);
        int m = 0, n = 0;//所有字符串的和
        int x = 0, y = 0;//只有数字的和
        int i = 0;
        for (i; i<a.length(); i++)
        {
            if (a[i] == ' ') break;
            m = m * 10 + (a[i] - '0');
            if (a[i] >= '0'&&a[i] <= '9')
            {
                x = x * 10 + (a[i] - '0');
            }
        }
        for (int j = i + 1; j<a.length(); j++)
        {
            //if(a[j]==' ') break; 
            n = n * 10 + (a[j] - '0');
            if (a[j] >= '0'&&a[j] <= '9')
            {
                y = y * 10 + (a[j] - '0');
            }
        }
        if (m <= 1000 && m >= 1 && m == x)
            cout << m;
        else
            cout << "?";
        cout << " + ";
        if (n <= 1000 && n >= 1 && n == y)
            cout << n;
        else
            cout << "?";
        cout << " = ";
        if (n <= 1000 && n >= 1 && m <= 1000 && m >= 1 && m == x&&n == y)
            cout << m + n;
        else
            cout << "?";
        return 0;
    }
    View Code

    7-13 出租

    写了挺久 虽然写出来了     但是感觉方法很简陋  其中 不知如何将set倒叙输出和处理卡了很久 还有 注意-‘0’

    #include <bits/stdc++.h>
    
    using namespace std;
    
    
    
    
    bool aaa(char *a);
    int main()
    {
    
    string s;
    getline(cin,s);
    
    set<int>a;
    map<int,int>ma;
    
    for(int i=0;i<s.size();i++)
    {
        if(!a.count(s[i])){a.insert(s[i]);}
    
    
    }
    int n1=a.size();
    int c=0;
    
    
         printf("int[] arr = new int[]{");int first=1;int scend=1;int c1=0;
    
         for (set<int>::iterator it = a.end(); ; --it)
         {
            if(first){first=0;}
            else if(scend){scend=0;  ma[*it-'0']=c++;  cout<<*it-'0';   c1++;}
            else if(c1<a.size()){c1++;  ma[*it-'0']=c++;  cout<<","<<*it-'0';}
            else break;
         }
         printf("};
    ");
    
      printf("int[] index = new int[]{");first=1;
    for(int i=0;i<s.size();i++)
    {
     if(first){first=0;cout<<ma[s[i]-'0'];}
     else cout<<','<<ma[s[i]-'0'];
    
    }
    printf("};");
    
    
    return 0;
    }
    View Code

    看了别人的好方法

    set<int, greater<int> > st; 这样就会从大到小排列 !!!

    附上代码   他用的是建立数组 indx[num]=下标  我是把num map成下标  差不多

    #include "algorithm"
    #include "set"
    #include "vector"
    #include "iostream"
    #include "cstdio"
     
    using namespace std;
     
    const int maxn = 11 + 10;
     
    int main() {
        set<int, greater<int> > st;
        vector<int> phone;
        int tmp;
        string str;
        getline(cin, str);
        for(int i = 0; i < str.length(); i++){
            phone . push_back(str[i]-'0');
            st.insert(str[i] - '0');
        }
        set<int>::iterator it = st . begin();
        int index[maxn] = {0};
        tmp = 0;
        int tmpindex = *it;
        index[tmpindex] = tmp++;
        cout << "int[] arr = new int[]{" << *it++;
        for (; it != st . end(); it++) {
            cout << "," << *it;
            tmpindex = *it;
            index[tmpindex] = tmp++;
        }
        cout << "};" << endl;
        cout << "int[] index = new int[]{" << index[phone[0]];
        for (int i = 1; i < phone . size(); i++) {
            cout << "," << index[phone[i]];
        }
        cout << "};" << endl;
        
        return 0;
    }
    View Code

    7-16 一帮一

    虽然过了 但是用了及其脑残加绕的方法  

    #include <bits/stdc++.h>
    
    using namespace std;
    
    struct stdu
    {
        string name;
        int f;
    }a[100][2];
    
    
    vector<string>na;
    int main()
    {
    int n;cin>>n;int c=0,c1=0;
    for(int i=1;i<=n/2;i++)
    {  int sec;cin>>sec;
        if(sec==0)
            {cin>>a[++c][0].name;  na.push_back(a[c][0].name);  a[c][0].f=1;}
        else
            {cin>>a[++c][1].name; na.push_back(a[c][1].name); a[c][1].f=1;}
    
    }
    
    for(int i=n/2+1;i<=n;i++)
    {   int sec;cin>>sec;
      
         if(sec==0)
    
             {
                 for(int k=n/2;k>=1;k--)
                    if(a[k][0].f!=1){cin>>a[k][0].name;a[k][0].f=1;break;}
             }
    
        else if(sec==1)
    
             {
                 for(int k=n/2;k>=1;k--)
                    if(a[k][1].f!=1){cin>>a[k][1].name;a[k][1].f=1;break;}
             }
    
    }
    for(int i=0;i<=n/2-1;i++)
        {
            cout<<na[i]<<" ";
    
            if(na[i][1]==a[i+1][0].name[1]&&na[i][2]==a[i+1][0].name[2])
            cout<<a[i+1][1].name;
            else
                cout<<a[i+1][0].name;
    
            cout<<endl;
        }
    
    
    
    
    
    return 0;
    }
    View Code

    明明这么简单的题目  只要两个循环 一个从开头开始 一个从结尾开始  然后匹配  就直接打印  这么方便  

    #include<stdio.h>
    struct node
    {
        int sex;
        char name[10];
        int flag;
    }data[51];
    int main()
    {
        int n;
        int count=0;
        scanf("%d",&n);
        for(int i=0;i<n;i++)
        {
            scanf("%d %s",&data[i].sex,&data[i].name);
            data[i].flag=0;
        }
        for(int i=0;i<n/2;i++)
        {
            for(int j=n-1;j>=n/2;j--)
            {
                if((data[i].sex!=data[j].sex)&&data[i].flag==0&&data[j].flag==0)
                {
                    data[i].flag =1;
                    data[j].flag =1;
                    count=count+2;
                    printf("%s %s
    ",data[i].name ,data[j].name );
                }
            }
            if(count==n)
            break;
        }
    }
    View Code

    7-19 红色警报

    不知道该如何储存道路方便 感觉二维数组非常麻烦

    用并查集


    7-20 列车调度

    还是超时

    #include <bits/stdc++.h>
    
    using namespace std;
    
    
    
    int main()
    {
    
    
    int n;cin>>n;
    
    int a[100005];
    int n1=1;
    int x;cin>>x;
    a[0]=x;
    for(int i=2;i<=n;i++)
    {
        int x;cin>>x;
    
        for(int j=0;j<=n1;j++)
        {
            if(x<a[j]){a[j]=x;break;}
            if(j==n1){a[n1]=x;n1++;break;}
        }
    
    
    }
    
    
    
    
    printf("%d",n1);
    
    
    return 0;
    }
    View Code

    要用二分查找 出第一个大于 aim的下标

    #include <bits/stdc++.h>
    
    using namespace std;
    
    
    int ef(int left,int right,int aim,int *a);
    int main()
    {
    
    
    int n;cin>>n;
    
    int a[100005];
    int n1=1;
    int x;cin>>x;
    a[0]=x;
    for(int i=2;i<=n;i++)
    {
        int x;cin>>x;
    
    
       int n2=ef(0,n1-1,x,a);
    
       if(n2>n1-1){a[n1]=x;n1++;}
       else a[n2]=x;
    
    
    }
    
    
    
    
    printf("%d",n1);
    
    
    return 0;
    }
    
    int ef(int left,int right,int aim,int *a)
    {
        while (left <= right) {
            int mid = (left + right) / 2;
            if (a[mid] > aim) {
                right = mid - 1;
            }
            else {
                left = mid + 1;
            }
        }
        return left;
    
    }
    View Code

     更为巧妙的方法 用内置函数

    #include <bits/stdc++.h>
     
    using namespace std;
    const int MAXN=40;
    int n,m;
    set<int>q;
    int main()
    {
        scanf("%d",&n);
        int x;
        for(int i=0;i<n;++i)
        {
            scanf("%d",&x);
            if(q.upper_bound(x)!=q.end())
            {
                q.erase(q.upper_bound(x));
            }
            q.insert(x);
        }
        printf("%u
    ",q.size());
        return 0;
    }
    View Code
  • 相关阅读:
    磁盘冗余 ---RAID磁盘管理
    linux磁盘管理
    linux基础命令
    Apache配置rewrite
    memcache运维整理
    mysql主从配置
    rsync相关整理
    Lua 学习笔记(六)
    Lua 学习笔记(五)
    Lua 学习笔记(四)
  • 原文地址:https://www.cnblogs.com/bxd123/p/10183176.html
Copyright © 2011-2022 走看看