周练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\n",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]!='\0';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("};\n");

  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\n",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\n",q.size());
    return 0;
}
View Code

 

转载于:https://www.cnblogs.com/bxd123/p/10183176.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值