问题描述
试题编号: | 201403-1 |
试题名称: | 相反数 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述
有 N 个非零且各不相同的整数。请你编一个程序求出它们中有多少对相反数(a 和 -a 为一对相反数)。
输入格式
第一行包含一个正整数 N。(1 ≤ N ≤ 500)。
第二行为 N 个用单个空格隔开的非零整数,每个数的绝对值不超过1000,保证这些整数各不相同。 输出格式
只输出一个整数,即这 N 个数中包含多少对相反数。
样例输入
5
1 2 3 -1 -2 样例输出
2
|
1 #include<iostream> 2 #include<bits/stdc++.h> 3 using namespace std; 4 #define LL long long 5 int main(){ 6 map<int,int>M; 7 int n,a,ans=0; 8 cin>>n; 9 for(int i=1;i<=n;++i){ 10 cin>>a; 11 M[a]++; 12 if(M[-a])ans++; 13 }cout<<ans<<endl; 14 return 0; 15 }
用map很方便。
问题描述
试题编号: | 201403-2 |
试题名称: | 窗口 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述
在某图形操作系统中,有 N 个窗口,每个窗口都是一个两边与坐标轴分别平行的矩形区域。窗口的边界上的点也属于该窗口。窗口之间有层次的区别,在多于一个窗口重叠的区域里,只会显示位于顶层的窗口里的内容。
当你点击屏幕上一个点的时候,你就选择了处于被点击位置的最顶层窗口,并且这个窗口就会被移到所有窗口的最顶层,而剩余的窗口的层次顺序不变。如果你点击的位置不属于任何窗口,则系统会忽略你这次点击。 现在我们希望你写一个程序模拟点击窗口的过程。 输入格式
输入的第一行有两个正整数,即 N 和 M。(1 ≤ N ≤ 10,1 ≤ M ≤ 10)
接下来 N 行按照从最下层到最顶层的顺序给出 N 个窗口的位置。 每行包含四个非负整数 x1, y1, x2, y2,表示该窗口的一对顶点坐标分别为 (x1, y1) 和 (x2, y2)。保证 x1 < x2,y1 2。 接下来 M 行每行包含两个非负整数 x, y,表示一次鼠标点击的坐标。 题目中涉及到的所有点和矩形的顶点的 x, y 坐标分别不超过 2559 和 1439。 输出格式
输出包括 M 行,每一行表示一次鼠标点击的结果。如果该次鼠标点击选择了一个窗口,则输出这个窗口的编号(窗口按照输入中的顺序从 1 编号到 N);如果没有,则输出"IGNORED"(不含双引号)。
样例输入
3 4
0 0 4 4 1 1 5 5 2 2 6 6 1 1 0 0 4 4 0 5 样例输出
2
1 1 IGNORED |
模拟一个类似于栈得数据结构,但是可以从栈中间位置删除元素,用vector就好了,加上他的erase()方法模拟下,用V得end当作栈顶。
1 #include<iostream> 2 #include<bits/stdc++.h> 3 using namespace std; 4 #define LL long long 5 #define pii pair<int,int> 6 struct window{ 7 int x1,y1,x2,y2,id; 8 }w; 9 vector<window>V; 10 int main(){ 11 int N,M,x,y; 12 cin>>N>>M; 13 for(int i=0;i<N;++i){ 14 cin>>w.x1>>w.y1>>w.x2>>w.y2; 15 w.id=i+1; 16 V.push_back(w); 17 }while(M--){ 18 cin>>x>>y; 19 bool ok=0; 20 for(int i=N-1;i>=0;--i){ 21 if(x>=V[i].x1&&x<=V[i].x2 22 &&y>=V[i].y1&&y<=V[i].y2){ 23 ok=1; 24 cout<<V[i].id<<endl; 25 w=V[i]; 26 V.erase(V.begin()+i); 27 V.push_back(w); 28 break; 29 } 30 }if(!ok)cout<<"IGNORED"<<endl; 31 } 32 return 0; 33 }
问题描述
试题编号: | 201403-3 |
试题名称: | 命令行选项 |
时间限制: | 1.0s |
内存限制: | 256.0MB |
问题描述: |
问题描述
请你写一个命令行分析程序,用以分析给定的命令行里包含哪些选项。每个命令行由若干个字符串组成,它们之间恰好由一个空格分隔。这些字符串中的第一个为该命令行工具的名字,由小写字母组成,你的程序不用对它进行处理。在工具名字之后可能会包含若干选项,然后可能会包含一 些不是选项的参数。
选项有两类:带参数的选项和不带参数的选项。一个合法的无参数选项的形式是一个减号后面跟单个小写字母,如"-a" 或"-b"。而带参数选项则由两个由空格分隔的字符串构成,前者的格式要求与无参数选项相同,后者则是该选项的参数,是由小写字母,数字和减号组成的非空字符串。 该命令行工具的作者提供给你一个格式字符串以指定他的命令行工具需要接受哪些选项。这个字符串由若干小写字母和冒号组成,其中的每个小写字母表示一个该程序接受的选项。如果该小写字母后面紧跟了一个冒号,它就表示一个带参数的选项,否则则为不带参数的选项。例如, "ab:m:" 表示该程序接受三种选项,即"-a"(不带参数),"-b"(带参数), 以及"-m"(带参数)。 命令行工具的作者准备了若干条命令行用以测试你的程序。对于每个命令行,你的工具应当一直向后分析。当你的工具遇到某个字符串既不是合法的选项,又不是某个合法选项的参数时,分析就停止。命令行剩余的未分析部分不构成该命令的选项,因此你的程序应当忽略它们。 输入格式
输入的第一行是一个格式字符串,它至少包含一个字符,且长度不超过 52。格式字符串只包含小写字母和冒号,保证每个小写字母至多出现一次,不会有两个相邻的冒号,也不会以冒号开头。
输入的第二行是一个正整数 N(1 ≤ N ≤ 20),表示你需要处理的命令行的个数。 接下来有 N 行,每行是一个待处理的命令行,它包括不超过 256 个字符。该命令行一定是若干个由单个空格分隔的字符串构成,每个字符串里只包含小写字母,数字和减号。 输出格式
输出有 N 行。其中第 i 行以"Case i:" 开始,然后应当有恰好一个空格,然后应当按照字母升序输出该命令行中用到的所有选项的名称,对于带参数的选项,在输出它的名称之后还要输出它的参数。如果一个选项在命令行中出现了多次,只输出一次。如果一个带参数的选项在命令行中出 现了多次,只输出最后一次出现时所带的参数。
样例输入
albw:x
4 ls -a -l -a documents -b ls ls -w 10 -x -w 15 ls -a -b -c -d -e -l 样例输出
Case 1: -a -l
Case 2: Case 3: -w 15 -x Case 4: -a -b |
一开始想用sscanf发现忘记了,而且用起来很麻烦。突然想到了sstrean这个神奇的流,贼拉好用。
有一个Case会出现带参命令但是不给你参数这种错误,注意特判下。
1 #include<bits/stdc++.h> 2 using namespace std; 3 #define LL long long 4 #define pii pair<int,int> 5 int main(){ 6 int M[30]={0}; 7 8 string str; 9 int N; 10 cin>>str; 11 cin>>N;getchar(); 12 for(int i=0;i<str.length();++i){ 13 M[str[i]-'a']=1; 14 if(i+1<str.length() && str[i+1]==':'){ 15 M[str[i]-'a']=2; 16 i++; 17 } 18 } 19 for(int i=1;i<=N;++i){ 20 bool ok[30]={0}; 21 string sm[30]; 22 string str1,s; 23 getline(cin,str1); 24 stringstream ss(str1); 25 cout<<"Case "<<i<<":"; 26 ss>>s; 27 while(ss>>s){ 28 if(s[0]!='-'||s.length()>2||!(s[1]>='a'&&s[1]<='z'))break; 29 int u=s[1]-'a'; 30 if(M[u]==0) break; 31 else if(M[u]==1){ 32 ok[u]=1; 33 }else{ 34 if(ss>>s){ 35 ok[u]=1; 36 sm[u]=s; 37 }else{ 38 break; 39 } 40 } 41 } 42 for(int i=0;i<30;++i){ 43 if(ok[i]){ 44 cout<<" -"<<(char)(i+'a'); 45 if(M[i]==2)cout<<" "<<sm[i]; 46 } 47 } 48 cout<<endl; 49 } 50 return 0; 51 }
-