noi1.9&1.10部分题解

1.9编程基础之顺序查找

1.查找特定的值

先用数组按输入顺序存放,再读入要找寻的目标数tmp,遍历一遍数组即可找到答案。
代码示例:

#include
const int N = 11000;
int a[N],tmp,n;
int main(){
	scanf("%d",&n);
	for(int i = 1;i <= n;i++) scanf("%d",a+i);
	scanf("%d",&tmp);
	for(int i = 1;i <= n;i++){
		if(a[i] == tmp){
			printf("%d\n",i);
			return 0;
		}
	}
	printf("-1\n");
	return 0;
}
2.输出最高分数的学生姓名

主要考察结构体的用法,也可以用一个int型数组和string类型数组来做。
代码示例:

#include
#include
struct Stu{
	int Score;
	char name[25];
};
Stu students[110];
const int INF = 0x3f3f3f3f;
int main(){
	int n;
	scanf("%d",&n);
	for(int i = 1;i <= n;i++){
		scanf("%d%s",&students[i].Score,students[i].name);
	}
	int mx = -INF;
	char tname[25]; 
	for(int i = 1;i <= n;i++){
		if(students[i].Score > mx){
			mx = students[i].Score;
			memcpy(tname,students[i].name,25);
		}
	}
	puts(tname);
	return 0;
}
3.不高兴的津津

按照题意,就是从这七组数据中找到和最大的那一组即为答案。
代码示例:

#include
int main(){
	int a,b,ans,mx = -1;
	for(int i = 1;i <= 7;i++){
		scanf("%d%d",&a,&b);
		if(a+b > mx){
			mx = a+b;
			ans = i;
		}
	}
	printf("%d\n",ans);
	return 0;
}
4.谁拿了最多的奖学金

这题主要是考察结构体用法,因为判断比较多,逻辑一定不能乱,按照逻辑来写,就会很轻松。
代码示例:

#include 
#include 
using namespace std;
struct Student
{
    char name[20];                //姓名
    int score1;                   //期末成绩
    int score2;                   //班级成绩
    char leader;                  //是否是班干部
    char weststudent;             //是否是西部学生
    int article;                  //论文数
    int money;                    //个人总奖金
};
Student a[100];
int main()
{
 
    int max=0;                    //学生编号
    int sum=0;                    //总奖金
    int n;                        //学生总数
    cin>>n;                       //输入学生总数
    for(int i=0; i>a[i].name;
        cin>>a[i].score1;
        cin>>a[i].score2;
        cin>>a[i].leader;
        cin>>a[i].weststudent;
        cin>>a[i].article;
    }
    for(int j=0; j80&&a[j].article>=1)
            a[j].money+=8000;
        if(a[j].score1>85&&a[j].score2>80)
            a[j].money+=4000;
        if(a[j].score1>90)
            a[j].money+=2000;
        if(a[j].score1>85&&a[j].weststudent=='Y')
            a[j].money+=1000;
        if(a[j].score2>80&&a[j].leader=='Y')
            a[j].money+=850;
        sum+=a[j].money;
    }
    for(int k=0; ka[max].money)
            max=k;
    }
    cout<
5.最大值和最小值的差
#include 
using namespace std;
int main()
{
    int M, i, x, min=10000, max=-10000;
    cin >> M;
    for (i=0; i> x;
        if (x > max) max = x;
        if (x < min) min = x;
    }
    cout << max-min << endl;
    return 0;
}
6.笨小猴

这题也没什么特殊的,但是却用到了判断素数的函数,判断一个数x是否为素数的函数模板需要牢记。
判断素数模板:

#include
bool isPrime(int x){
	if(x < 2) return false;
	if(x == 2 || x == 3) return true;
	if(x % 2 == 0) return false;
	for(int i = 3;i*i <= x;i += 2)
		if(x%i == 0) return false;
	return true;
}
int main(){
	for(int i = 1;i <= 1000;i++){
		if(isPrime(i)) printf("%d ",i);
		
	}
	return 0;
}
7.不与最大数相同的数字之和

在求最大值的基础上再开一次循环即可。

8.白细胞计数

去掉一个最大值,一个最小值,然后求平均值,再求每个元素与平均值差的绝对值,找出绝对值最大的值。
代码示例:

#include 
#include 
#include 
using namespace std;
int main()
{
    int n, i, x=0, y=0;
    double a[300], maxd, mind, sum=0.0, avg, deviation=0.0;
    cin >> n;
    for (i=0; i> a[i];
        if (i == 0) maxd=mind=a[i];
        if (a[i] > maxd){
            x = i;
            maxd = a[i];
        }
        if (a[i] < mind){
            y = i;
            mind = a[i];
        }
        sum += a[i];
    }
    sum -= maxd;
    sum -= mind;
    avg = sum / (n-2);
    for (i=0; i deviation) deviation = d;
    }
    cout << fixed << setprecision(2) << avg << " ";
    cout << fixed << setprecision(2) << deviation << endl;
    return 0;
}
9.直方图

开一个标记数组即可
代码示例:

#include 
using namespace std;
int main()
{
    int n, x, i, Fmax=0;
    int histogram[10000]={0}; // 记录每个数字出现的次数
    cin >> n;
    for (i=0; i> x;
        histogram[x]++;
        if (x > Fmax) Fmax = x;
    }
    for (i=0; i<=Fmax; i++)
        cout << histogram[i] << endl;
    return 0;
}
10.找最大数序列

本题考察将字符类型转换为整数类型的方法,本题初做起来会觉得写起来很麻烦,但其实只要逻辑思路清晰,写起来也很轻松。注意要判断边界范围。

#include
#include
#include
using namespace std;
int n,tot;
struct Node{
	int a,idx;
}num[4000];
void splitStr(string str,int idx){
	int tmp = 0;
	for(int i = 0;str[i];i++){
		if(str[i] == ','){
			num[++tot].a = tmp;
			num[tot].idx = idx;
			tmp = 0;
		}else{
			tmp = tmp*10 + str[i]-'0';
		}
	}
	num[++tot].a = tmp;
	num[tot].idx = idx;
	tmp = 0;
}
int main(){
	string str;
	cin >> n;
	for(int i = 1;i <= n;i++){
		cin >> str;
		splitStr(str,i);
	}
	int mx = -1;
	for(int i = 1;i <= tot;i++) mx = max(mx,num[i].a);
	printf("%d\n",mx);
	bool flag = true;
	int pre = -1;
	for(int i = 1;i <= tot;i++){
		if(num[i].a == mx && num[i].idx != pre){
			if(flag == false) printf(","); 
			printf("%d",num[i].idx);
			flag = false;
			pre = num[i].idx;
		}
	}
} 
11.连续出现的字符
#include 
#include 
using namespace std;
int main()
{
    char cur;
    string s;
    int k, i, times=0;
    cin >> k >> s;
    cur = s[0];
    for (i=0; i= k){
                cout << cur << endl;
                return 0;
            }
        }
        else{
            cur = s[i];
            times = 1;
        }
    }
    cout << "No" << endl;
    return 0;
}
12.最长平台

就是找最长连续相同的数的长度嘛

#include 
using namespace std;
int main()
{
    int n, i, x, cur, len=1, maxl=1;
    cin >> n >> x;
    cur = x;
    for (i=1; i> x;
        if (x == cur){
            len++;
        }
        else{
            len = 1;
            cur = x;
        }
        if (len > maxl) maxl = len;
    }
    cout << maxl << endl;
    return 0;
}
13.整数去重

n很大,所以二重循环有点悬,但是每个整数却很小,在[10,100],所以可以用标记数组来解决

#include 
using namespace std;
int main()
{
    int n, i, x, table[20001]={0};
    cin >> n;
    for (i=0; i> x;
        table[x]++;
        if (table[x] == 1){
            cout << x << " ";
        }
    }
    cout << endl;
    return 0;
}
14.铺地毯

因为我们的地毯是按顺序铺的嘛,所以最后一个覆盖该点的地毯就是最上面的,就是所求答案。

#include 
using namespace std;
int main()
{
    int n, a[10001], b[10001], g[10001], k[10001], x, y, no=-1, i;
    cin >> n;
    for (i=1; i<=n; i++) {
        cin >> a[i] >> b[i] >> g[i] >> k[i];
    }
    cin >> x >> y;
    for (i=1; i<=n; i++) {
        if ((x>=a[i]&&y>=b[i]) && (x<=(a[i]+g[i])&&(y<=(b[i]+k[i])))) no = i;
    }
    cout << no << endl;
    return 0;
}
15.接水问题
#include 
#include 
using namespace std;
int main()
{
    int m, n, i, j, time=0, w[10000]={0}, tap[100]={0};
    cin >> n >> m;
    for (i=0; i> w[i];
    for (i=0; i

1.10

8病人排队

这题将病人分为两类:老年人和非老年人。对于非老年人的输出很简单,直接按照读入顺序输出即可;对于老年人的输出则需要按照年龄降序,并当年龄相同时按照读入顺序输出。于是我们可以先对老年人进行排序并输出,随后再按读入顺序输出非老年人即可。由于数据量不大,所以对于老年人的输出采取了O(N^2)的写法。

#include
struct Node{
	char id[15];
	int age;
}nodes[150],olders[150];
bool vis[150];
int main(){
	int n,tot = 0;
	scanf("%d",&n);
	for(int i = 1;i <= n;i++){
		scanf("%s%d",nodes[i].id,&nodes[i].age);
		if(nodes[i].age >= 60) olders[tot++] = nodes[i];
	}
	bool flag = true;
	while(flag){
		flag = false;
		int mx = -1,idx;
		for(int i = 0;i < tot;i++){
			if(vis[i] == false && olders[i].age > mx){
				idx = i;
				mx = olders[i].age;
			}
		}
		if(mx != -1){
			printf("%s\n",olders[idx].id);
			flag =true;
			vis[idx] = true;
		}
	}
	for(int i = 1;i <= n;i++){
		if(nodes[i].age < 60) printf("%s\n",nodes[i].id);
	}
	return 0;
}
9明明的随机数

这题容易想到的思路有两种,一种是先排序,再统计有多少个不同的数并输出;另一种方法就是用标记数组,这里采用第二种方法,即用标记数组来做。

#include
using namespace std;
int vis[1001];
int main(){
        int N,n;
        cin >> N; 
        for(int i = 1;i <= N;i++){
                cin >> n;
                vis[n] = 1;
        }
        int cnt = 0;
         for(int i = 1;i <= 1000;i++){
                if(vis [i])    cnt++;
        }
        cout << cnt << endl;
    for(int i = 1;i <= 1000;i++){
                if(vis [i])    cout << i << " ";
        }
        return 0;}
10单词排序

这题主要工作在于如何读入这些个数不确定的单词。由于两个单词中间可能有若干个空格间隔,所以我们对于空格的判断是分割单词的重点。代码中采用string类型变量,简化代码并增强可读性,当然用char类型数组也是可以的。分割完单词之后就是按字典序排序,而去重则可以在输出时候完成,具体见代码。

#include
#include
#include
using namespace std;
int tot = 0;
string str,tstr = "",words[150];
int main(){
	getline(cin,str);
	for(int i = 0;str[i];i++){
		if(str[i] == ' ' && tstr == "") continue;
		else if(str[i] == ' '){
			words[tot++] = tstr;
			tstr = "";
			continue;
		}
		tstr += str[i];
	}
	words[tot++] = tstr;
	sort(words,words+tot);
	for(int i = 0;i < tot;i++){
		if(i != 0 && words[i] == words[i-1]) continue;
		cout << words[i] << endl;
	} 
	return 0;
}

你可能感兴趣的:(noi1.9&1.10部分题解)