复试准备-day9-CCF

201403-2-窗口

这里是引用

#include<stdio.h>
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include <algorithm>
using namespace std;
int n, m;
const int N = 15;
//图层
struct ck {
	int x1,y1,x2,y2;
	int flag;//标记层数
}w[N];
//获取坐标最顶层的层数
int get_num(int x, int y) {
	for (int i = n; i > 0; i--) {
		if (x >= w[i].x1 && x<=w[i].x2 && y>=w[i].y1 && y <= w[i].y2)
			return i;
	}
	return 0;
}

int main() {
	int x, y;
	scanf("%d %d", &n, &m);
	for (int i = 1; i <= n; i++) {
		scanf("%d %d %d %d", &w[i].x1, &w[i].y1, &w[i].x2, &w[i].y2);
		w[i].flag = i;
	}

	while (m > 0) {
		scanf("%d %d", &x, &y);
		int k = get_num(x, y);
		if (!k) {
			printf("IGNORED\n");
		}
		else {//将全中的层数放到顶层
			printf("%d\n", w[k].flag);
			auto r=w[k];
			for (int i = k; i <= n; i++) w[i] = w[i + 1];
			w[n] = r;
		}

		m--;
	}
	return 0;
}


在这里插入图片描述
ccf模拟题的平台老是编译错误

201409-1-相邻数对

问题描述
  给定n个不同的整数,问这些数中有多少对整数,它们的值正好相差1。
输入格式
  输入的第一行包含一个整数n,表示给定整数的个数。
  第二行包含所给定的n个整数。
输出格式
  输出一个整数,表示值正好相差1的数对的个数。
样例输入
6
10 2 6 3 7 8
样例输出
3
样例说明
  值正好相差1的数对包括(2, 3), (6, 7), (7, 8)。
评测用例规模与约定
  1<=n<=1000,给定的整数为不超过10000的非负整数。

#include<stdio.h>
#include<iostream>
using namespace std;
//相邻整数对
int main() {
	int n;
	int temp;
	int count=0;

	scanf("%d", &n);

	int a[1005] ;
	for (int i = 1; i < 1005; i++) a[i] = 0;

	while (n > 0) {
		scanf("%d", &temp);
		a[temp] = 1;
		n--;
	}
	for (int i = 1; i <= 1000; i++) {
		if (a[i] == 1 && a[i + 1] == 1) count++;
	}
	printf("%d", count);
	return 0;
}

最后会有一个运行错误,不知道哪里有问题
在这里插入图片描述
201409-2-画图

这里是引用

#include<stdio.h>
#include<iostream>
using namespace std;

const int N = 110;

int tu[N][N];

int main() {
	int n;
	int count = 0;
	int x1, y1, x2, y2;

	scanf("%d", &n);

	for (int i = 0; i < N; i++) {
		for (int j = 0;j < N; j++)
			tu[i][j] = 0;
	}

	while (n > 0) {//遍历过的为1
		scanf("%d %d %d %d", &x1, &y1, &x2, &y2);
		for (int i = x1; i < x2; i++) {//注意不是<=x2
			for (int j = y1; j < y2; j++) {
				tu[i][j] = 1;
			}
		}
		n--;
	}

	for (int i = 0; i < N; i++) {
		for (int j = 0; j < N; j++)
			if (tu[i][j] == 1) count++;
	}
	printf("%d", count);
	return 0;
}

ps:(1,1)多代表的点与所代表的框是不一样的
在这里插入图片描述

201412-1-门禁系统

这里是引用

#include<stdio.h>
#include<iostream>
using namespace std;

int main() {
	int n;
	int temp;
	scanf("%d", &n);//记录条数
	int count[1005];
	for (int i = 0; i < 1005; i++) count[i] = 0;
	while (n > 0) {
		scanf("%d", &temp);
		count[temp]++;
		printf("%d ", count[temp]);
		n--;
	}
	return 0;
}

在这里插入图片描述
201409-3-字符串匹配
在这里插入图片描述

#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;


string get(string s) {
	string re;
	for (int i = 0; i < s.size(); i++) {
		re += towupper(s[i]);
	}
	return re;
}

int main() {
	string mo;
	int flag;//flag为0时大小写不敏感,为1时大小写敏感
	int n;
	cin >> mo;
	cin >> flag;
	cin >> n;
	while (n > 0) {
		string temp;
		cin >> temp;
			if (flag == 1) {//区分大小写
				if (temp.find(mo) != -1) cout<<temp<<endl;
			}
			if (flag == 0) {//不区分大小写
				if (get(temp).find(get(mo)) != -1) cout << temp << endl;
			}
	n--;	
	}
	return 0;
}

在这里插入图片描述

此题中用cin,cout更为方便

201403-3-命令行选项

这里是引用

#include<stdio.h>
#include<string.h>
#include<vector>
#include<sstream>
#include<iostream>
using namespace std;

int n;
string ss;

int kind[26];//无参数时为1,有参数时为2,其他情况为0
string abc[26];//字母对照表

string temp;

int main() {
	cin >> ss;
	//处理收到的ss格式字符串
	for (int i = 0; i < ss.size(); i++)
	{
		if (i + 1 < ss.size() && ss[i + 1] == ':')
		{
			kind[ss[i] - 'a'] = 2;//带参数
			i++;//跳过后面的:
		}
		else
		{
			kind[ss[i] - 'a'] = 1;//不带参数
		}
	}
	cin >> n;
	getchar();//跳过空格

	for (int i = 1; i <= n; i++) {

		//字母对照表格式化
		for (int k = 0; k < 26; k++) {
			abc[k].clear();
		}
		//将一行命令分割装入数组之中
		getline(cin, temp);//获取一行字符串长度
		printf("Case %d:", i);

		stringstream ssin(temp);
		vector<string>  ans;//ans为不定长的字符串容器,且为二维数组

		while (ssin >> temp)
		{
			ans.push_back(temp);
		}

		//逐一遍历动态数字中分割的字符串
		for (int j = 1; j < ans.size(); j++)
		{
			if (ans[j][0] != '-' || ans[j][1] < 'a' || ans[j].size() != 2 )
				break;

			if (kind[ans[j][1] - 'a'] == 1)
			{//无参数时,当重复出现时重复工作
				abc[ans[j][1] - 'a'] = "*";
			}
			else if (kind[ans[j][1] - 'a'] == 2)
			{//有参数时
				if (j + 1 < ans.size())
				{
					abc[ans[j][1] - 'a'] = ans[j + 1];
					j++;//跳过后面的参数值
				}
				else break;
			}
			else break;
		}
		//输出合法的操作
		for (int m = 0; m < 26; m++) 
		{
			if (abc[m].size())
			{//若字母对照表被标记过
				printf(" -%c", m + 'a');
				if (kind[m] == 2)
				{//有参数
					cout << " " << abc[m];
				}
			}
		}

		printf("\n");
	}

	return 0;
}

新学一种分割字符串的方法

#include<stdio.h>
#include<sstream>
#include<string>
using namespace std;
int main(){
	string str="nice to meet you";
	stringstream is(str);
	string s;
	while(is>>s){
		cout<<s<<endl;//将按照空格分隔字符串 
		//nice
		//to 
		//meet
		//you
	}
	return 0;
}

参考答案借鉴:wingrez

参考答案借鉴:诠释你的Mr贾

建议看懂以后自己写一遍,加强记忆,不要直接对着抄

vector.clear()的真正作用是:把size设置成0,capacity不变

改了快两个小时,就差跟别人的一模一样
在这里插入图片描述
但我的vector老是越界
最后找到原因是把其中的j达成i了

记录一些无语的错误:
把case打错成csse,导致我无数次的修改
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值