猜数字

描述:

一群人坐在一起,每人猜一个 100 以内的数,谁的数字最接近大家平均数的一半就赢。本题就要求你找出其中的赢家。

输入格式:

输入在第一行给出一个正整数N(≤104)。随后 N 行,每行给出一个玩家的名字(由不超过8个英文字母组成的字符串)和其猜的正整数(≤ 100)。

输出格式:

在一行中顺序输出:大家平均数的一半(只输出整数部分)、赢家的名字,其间以空格分隔。题目保证赢家是唯一的。

输入样例:

7
Bob 35
Amy 28
James 98
Alice 11
Jack 45
Smith 33
Chris 62

输出样例:

22 Amy

代码:

#include<bits/stdc++.h>
using namespace std;
typedef struct{
    char name[10];
    int num;
}Edu;
int main(){
    int n;
    cin>>n;
    Edu s[n];
    double sum = 0;
    for(int i=0;i<n;i++){
        cin>>s[i].name>>s[i].num;
        sum+=s[i].num;
    }
    sum=sum/n/2.0;
    printf("%.0lf ",sum);
    Edu k;
    k.num = 101;
    for(int i=0;i<n;i++){
        s[i].num = abs(s[i].num-sum);
        if(s[i].num<k.num){
            k = s[i];
        }
    }
    cout<<k.name;
    return 0;
} 

解析:

将姓名和猜的数字作为结构体保存,计算出平均数的一半,最后找到与要猜的数字的差的绝对值最小的数字。

A-B

描述:

本题要求你计算AB。不过麻烦的是,AB都是字符串 —— 即从字符串A中把字符串B所包含的字符全删掉,剩下的字符组成的就是字符串AB

输入格式:

输入在2行中先后给出字符串AB。两字符串的长度都不超过104,并且保证每个字符串都是由可见的ASCII码和空白字符组成,最后以换行符结束。

输出格式:

在一行中打印出AB的结果字符串。

输入样例:

I love GPLT! It's a fun game!
aeiou

输出样例:

I lv GPLT! It's fn gm!

代码:

//暴力枚举法
#include<bits/stdc++.h>
using namespace std;
int main()
{
    // C输入 

    char a[10001],b[10001];
    int flag = 1,i,j;
    gets(a);
    gets(b);
    for(i=0; i<strlen(a); i++){
        for(j=0; j<strlen(b); j++){
            if(a[i]==b[j])
                flag = 0;
        }
        if(flag!=0)
            printf("%c",a[i]);
        flag = 1;
    }

    //      C++第一种输入
    //  int flag = 1;
    //    string a,b;
    //  getline(cin,a);
    //  getline(cin,b);
    //  for(int i=0; i<a.length(); i++){
    //      for(int j=0; j<b.length(); j++){
    //          if(a[i]==b[j])
    //              flag = 0;
    //      }
    //      if(flag!=0)
    //          cout << a[i];
    //      flag = 1;
    //  }

    //      C++第二种输入
    // int flag = 1;
    // char a[10001],b[10001];
    // cin.getline(a,10001);
    // cin.getline(b,10001);
    // for(int i=0; i<strlen(a); i++){
    //  for(int j=0; j<strlen(b); j++){
    //      if(a[i]==b[j])
    //          flag = 0;
    //  }
    //  if(flag!=0)
    //      cout << a[i];
    //  flag = 1;
    // }
    return 0;
}

解析:

  1. gets():接收一行字符数组,参数是字符指针
  2. getline():接收一行字符串,参数是输入流和字符串(string)
  3. cin.getline():接收一行字符数组,并规定接收多少,到什么字符结束,参数是字符指针,字符个数(int),结束符(char)

由于包含空格,所以使用上述三种任意一种来保存字符串,然后两个循环遍历两个字符串,满足条件的将flag置零,最后如果不是被删除的字符则输出并将flag恢复成1。

代码:

//数组法
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4;
char s[N+5];
int a[300];
int main(){
    char c;
    int i = 0;
    while((c = getchar())!='\n'){
        s[i] = c;
        a[c]++;
        i++;
    }
    while((c = getchar())!='\n'){
        a[c] = 0;
    }
    for(int i=0;i<strlen(s);i++){
        if(a[s[i]]!=0){
            printf("%c",s[i]);
        }
    }
    return 0;
} 

解析:

利用一个数组接收要被处理的字符串,并定义另一个整型数组,代表256个ASCLL码,当第二行输入字符时,将对应的字符所对应的ASCLL码数组置零,最后循环输出数组,当对应的ASCLL是零是,则不输出,反之,则输出。


一只小菜鸡