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;
}
建议看懂以后自己写一遍,加强记忆,不要直接对着抄
vector.clear()的真正作用是:把size设置成0,capacity不变
改了快两个小时,就差跟别人的一模一样
但我的vector老是越界
最后找到原因是把其中的j达成i了
记录一些无语的错误:
把case打错成csse,导致我无数次的修改