//01背包问题 #include<iostream> using namespace std; const int maxn = 100; //物品数最大值 const int maxv = 1000;//容量最大值 int main() { int n;//n件物品 int V;//b背包容量 int dp[maxn][maxv] ;//dp[i][v]代表前i件物品恰好装入容量为v的背包的最大价值 int w[maxn];//物品重量 int c[maxn];//物品价值 int v; while(cin>>n>>V) { for(int i=1;i<=n;i++) { cin>>w[i]; } for(int i=1;i<=n;i++) { cin>>c[i]; } //初始化边界 for(v=0;v<=V;v++)//放入0件物品的价值为0 dp[0][v] = 0; for(int i=1;i<=n;i++) { for(v=1;v<=V;v++) { if(v<w[i]) //第i件物品放不进去 dp[i][v] = dp[i-1][v]; else dp[i][v] = max(dp[i-1][v],dp[i-1][v-w[i]]+c[i]); } } cout<<dp[n][V]<<endl; } return 0; } //折点计算 #include<iostream> using namespace std; int main() { int n; int a[1001]; bool flag[1001];//flag等于true代表上升,flag = false 代表下降 int count; while(cin>>n) { for(int i = 0;i<n;i++) { cin>>a[i]; } for(int i = 1;i<n;i++) { if(a[i]>a[i-1]) flag[i] = true; else flag[i] = false; } count = 0; for(int i = 1;i<n-1;i++) { if(flag[i] != flag[i+1]) count++; } cout<<count<<endl; } return 0; } //最小差值 #include<iostream> #include<set> #include<algorithm> using namespace std; int main() { int n; int a[1001]; set<int> cha; int temp; while(cin>>n) { for(int i=0;i<n;i++) cin>>a[i]; sort(a,a+n); //排序 for(int i=1;i<n;i++) { temp = a[i] - a[i-1]; //求差值 cha.insert(temp); //存到set数组中 } set<int>::iterator it = cha.begin(); cout<<*it<<endl; } return 0; } //类似退圈游戏 #include<iostream> using namespace std; struct node{ int number; struct node * next; }; node* createLink(int n) { node * L = new node(); L->number = 1; L->next = NULL; node * p = new node(); p = L; for(int i=2;i<=n;i++) { node * r = new node(); r->number = i; r->next = NULL; p->next = r; p = r; } p ->next = L; return L; } void deleteNode(node * p)//要删除q节点 { node * r = new node(); r = p->next; while(r->next != p) { r=r->next; } r->next = p->next; delete p; } int play(node * L,int n,int k) { int num = n; int count = 1; node * p = new node(); node * q = new node(); p = L; while(num != 1) { if(count % k == 0 || count % 10 == k) { q = p->next; deleteNode(p); p = q; num--; } else p = p->next; count++; } return p->number; } int main() { int n; int k; while(cin>>n>>k) { node * L = new node(); L = createLink(n); cout<<play(L,n,k)<<endl; } return 0; } //碰撞的小球 #include<iostream> using namespace std; struct Ball{ int location; //位置 int direction; //运动方向 0是左,1是右 }ball[101]; int main() { int n;//小球个数 int L;//线段长度 int t;//计算t秒之后 int k; while(cin>>n>>L>>t) { for(int i=1;i<=n;i++) { cin>>ball[i].location; ball[i].direction = 1; //初始均向右运动 } k = 0;//记录时间 while(k<t) { k++; for(int i=1;i<=n;i++) { if(ball[i].direction == 1) ball[i].location++; else ball[i].location--; if(ball[i].location == 0) //走到最左端改变方向 ball[i].direction = 1; if(ball[i].location == L) //走到最右端改变方向 ball[i].direction = 0; //两球相撞,改变方向 for(int j=1;j<i;j++) { if(ball[i].location == ball[j].location) { if(ball[i].direction == 1 ) { ball[i].direction = 0; ball[j].direction = 1; } else { ball[i].direction = 1; ball[j].direction = 0; } } } }//for }//while(k<=t) for(int i=1;i<=n;i++) { cout<<ball[i].location<<" "; } cout<<endl; } return 0; } //买菜 #include<iostream> #include<map> using namespace std; int main() { int n; map<int,int> mp; int a,b; int i,j; int count; while(cin>>n) { count = 0; for(i=0;i<2*n;i++) { cin>>a>>b; for(j = a;j<b;j++) { mp[j]++; } } for(map<int,int>::iterator it = mp.begin();it!=mp.end();it++) { if(it->second == 2) count++; } cout<<count<<endl; } return 0; } //小明上学 #include<iostream> #include<map> using namespace std; int main() { int r,y,g; int n; map<int,int> mp; int a,b; int sum ; while(cin>>r>>y>>g) { sum = 0; cin>>n; for(int i=0;i<n;i++) { cin>>a>>b; sum += b; if(a==2) sum += r; if(a == 3) sum -= b; } cout<<sum<<endl; } return 0; } //小明放学 #include<iostream> using namespace std; int main() { int r,y,g; int n; long long sum; int a,b; int x; while(cin>>r>>y>>g) { sum = 0; cin>>n; for(int i =0;i<n;i++) { cin>>a>>b; x = (sum - b)%(r+y+g); if(a == 0) { sum += b; } else if(a == 1)//红灯 { if(x<0) //还是红灯, sum += b - sum; else if(x<=g) //绿灯 sum +=0; else if(x>g&&x<=g+y) //黄 sum +=(g+y) - x + r; else sum += (r+y+g) - x; //红灯 } else if(a == 2)//黄灯 { if(x<0) //还是黄灯 sum += b - sum + r; else if(x<=r) //红灯 sum +=r - x; else if(x>r&&x<=r+g) //绿灯 sum += 0; else sum += (r+y+g) - x + r; //黄灯 } else//绿灯 { if(x<0) //还是绿灯 sum += 0; else if(x<=y) //黄 sum +=y - x + r; else if(x>y&&x<=y+r) //红灯 sum += r+y - x; else sum += 0; //绿灯 } } cout<<sum<<endl; } return 0; } /*给出一个01字符串(长度不超过100),求其每一个子串出现的次数。*/ #include<iostream> #include<string> #include<map> using namespace std; int main() { string str; map<string , int> mapstr;//试用map,本身已经用字典序排序 string substring; while(cin>>str) { int len = str.length(); mapstr.clear(); //清空mapstr for(int i=0;i<len;i++) { substring=""; /*单个0或1*/ substring+=str[i]; if(mapstr.find(substring)!=mapstr.end()) { mapstr[substring]++; } else{ mapstr[substring] = 1; } /*从当前位置往后找其子串*/ for(int j=i+1;j<len;j++) { substring+=str[j]; if(mapstr.find(substring)!=mapstr.end()) { mapstr[substring]++;//匹配 } else{ mapstr[substring] = 1; } } } //输出 for(map<string,int>::iterator it=mapstr.begin();it!=mapstr.end();it++) { if(it->second>1) { cout<<it->first<<" "<<it->second<<endl; } } } return 0; } //质因数个数 #include<iostream> #include<math.h> using namespace std; const int maxn =100000; bool isPrime(int n) { if(n==1) return false; int sqr = sqrt(1.0*n); for(int i=2;i<=sqr;i++) { if(n%i==0) return false; } return true; } int prime[maxn];//存放素数 int pnum = 0; void findPrime() { for(int i=2;i<maxn;i++) if(isPrime(i)) { prime[pnum] = i; pnum++; } } //求质因数方法一:求出一定区间内所有的质数,然后判断 /* int countAppro(int n) { int count = 0;//记录个数 int sqr = sqrt(1.0*n); for(int i=0;i<pnum && prime[i]<=sqr;i++) { if(n%prime[i]==0) { count++; n/=prime[i]; while(n%prime[i]==0) { count++; n/=prime[i]; } } if(n==1) break; } if(n!=1) count++; return count; }*/ //直接判断 int countAppro(int n) { int count = 0;//记录个数 int sqr = sqrt(1.0*n); for(int i=2;i<=sqr;i++) { if(n%i==0&&isPrime(i)) { count++; n/=i; while(n%i==0) { count++; n/=i; } } if(n==1) break; } if(n!=1) count++; return count; } int main() { //findPrime(); int n; while(cin>>n) { cout<<countAppro(n)<<endl; } return 0; } //上几真题 2008年 A #include<iostream> #include<algorithm> using namespace std; int main() { int n; int a[1001] ={}; bool flag; int temp = 0; while(cin>>n&&n!=0) { flag = true; for(int i = 0;i<n;i++) { cin>>a[i]; } sort(a,a+n); temp=a[1] - a[0]; for(int i = 1;i<n;i++) { if(a[i] - a[i-1] != temp) { flag = false; break; } } if(flag == true) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; } B #include<iostream> #include<string> #include<math.h> using namespace std; int main() { int n; int sum; int temp; while(cin>>n && n != 0) { sum = 0; temp = n; while(temp) { sum += pow(temp%10,3.0); temp /= 10; } if(sum == n) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; } C #include<iostream> using namespace std; /*统计每个点变回原样的次数,其中最大值即为所求*/ int main() { int count,a,b,ta,tb; int index;//记录矩阵每个点变化的最大值 int N; while(cin>>N) { index = 0;//初始化为0 if(N==0) break; if(N<=2||N>10) continue; for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { ta = i; tb = j; count = 0 ; do{ a = (ta+tb) % N; b = (ta + 2*tb) % N;//需要借助a,b作为中转的原因是,这一步需要用到原来的ta值而不是变化后的ta值 ta = a; tb = b; count++; if(ta == i&&tb==j)//若坐标点经过若干次转化为原来的 { index = count>index?count:index; break; } }while(count<=N*N/2); } } cout<<index<<endl; } } /*如下方法行不通,想通过比较两个矩阵来实现,但是矩阵会变化,*/ /*int N; bool equal(int a[][100],int b[][100]) { for(int i=0;i<N;i++) { for(int j=0;j<N;j++) { if(a[i][j] != b[i][j]) return false; } } return true; } int main() { int n; int a[100][100] = {0}; int b[100][100] = {0}; int count; int temp; while(cin>>N) { n = 1; for(int i=0;i<N;i++) for(int j=0;j<N;j++) { a[i][j] = n; n++; } int ix = 0; int jx = 0; for(int i=0;i<N;i++) for(int j=0;j<N;j++) { temp = a[i][j]; ix = (i+1) % N; jx = (i + 2*j) % N; b[ix][jx] = temp; } count = 1; while(!equal(a,b)) { count++; for(int i=0;i<N;i++) for(int j=0;j<N;j++) { temp = b[i][j]; ix = (i+1) % N; jx = (i + 2*j) % N; b[ix][jx] = temp; } } cout<<count<<endl; } return 0; }*/ D #include<iostream> #include<math.h> #include<vector> using namespace std; vector <int> yueshu; int count = 0; //素数判断 bool isPrime(int n) { for(int i =2;i<=sqrt((double)n);i++) { if(n%i == 0) { return false; } } return true; } void Approximates(int n)//求质因数 { int temp = n; int i = 2; //正整数的因数分解可将正整数表示为一连串的质因子相乘,质因子如重复可以用指数表示。 while(temp!=1) { if(temp%i == 0&&isPrime(i)) { yueshu.push_back(i); count++; temp /= i;//每次取得一个因数,就除以这个因数 i--; } i++; } } //求一个整数各位数字之和 int wei_Add(int n) { int temp = n; int sum = 0; while(temp) { sum += temp%10; temp/=10; } return sum; } int main() { int n; int yueshu_sum; while(cin>>n&&n!=0) { //初始化工作 yueshu_sum = 0;//约数各个位数之和 count = 0;//质因数个数 yueshu.clear(); //求质因数 Approximates( n); //求每个质因数的各位数字和 for(int i=0;i<count;i++) { yueshu_sum += wei_Add(yueshu[i]); } //比较 if(wei_Add(n) == yueshu_sum) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; } 2009 A #include<iostream> #include<math.h> using namespace std; //采用此方法运行时间太长 /*bool isWanshu(int n) { int sum = 1; for(int i = 2;i<=sqrt(n*1.0);i++) { if(n%i==0) { sum+=i; sum += n/i; } } if(sum == n && n!=1) return true; else return false; }*/ //应先将1-100000之间的完数计算出来,存到数组中 int wanshu[10] = {0}; int index = 0; void findWanshu() { int sum; for(int n=2;n<100000;n++) { sum = 1; //1一定是因子 for(int i = 2;i<=sqrt(n*1.0);i++)//只需计算到根号n之前 { if(n%i==0) { sum+=i; sum += n/i; } } if(sum==n) //是完数则存入数组 { wanshu[index] = n; index++; } } } int main() { findWanshu(); int a = 0; int b = 0; while(cin>>a>>b) { for(int j = 0;j<index;j++) { if(wanshu[j]>=a && wanshu[j]<=b) cout<<wanshu[j]<<endl; } } return 0; } B #include<iostream> #include<algorithm> using namespace std; bool cmp(int a,int b) { return a>b; } int main() { int m; while(cin>>m) { int a[11][11] = {0}; int b[30]= {0}; for(int i=0;i<m;i++) { for(int j=0;j<m;j++) { cin>>a[i][j]; } } int x = 0; for(int i=0;i<m;i++) { for(int j=0;j<m;j++) { if(i == j) b[0] += a[i][j];//主对角线 //矩阵副对角线有i+j = m-1 if(i+j == m-1) b[2*m+1] += a[i][j]; if(j==0) x++;//每次换行就加1 b[x] += a[i][j];//每一行的和 } } for(int j=0;j<m;j++) { for(int i=0;i<m;i++) { if(i==0) x++;//每次换列就加1 b[x] += a[i][j];//列 } } sort(b,b+2*m+2,cmp); for(int i = 0;i<2*m+1;i++) cout<<b[i]<<" "; cout<<b[2*m+1]<<endl; } return 0; } /* 运行时间:3ms 占用内存:368k */ #include<iostream> #include<algorithm> using namespace std; bool cmp(int a,int b) { return a>b; } //学长写法 /* //求每一行的和 for(int i=0;i<m;i++) { sum = 0; for(int j=0;j<m;j++) { sum+=a[i][j]; } num[n] = sum; n++; } //求主对角线 for(i =0,j = 0;i<m;i++,j++) sum += a[i][j]; //求副对角线 for(i =0,j = m-1;i<m;i++,j--) sum += a[i][j]; */ C /* 对于本题而言,下边使用了快速分解定理: 1、即对于一个合数总存在有质数因子,所以我们在分解合数的时候不需要判断被整除的因子是否为质数。 2、理解是一个难点,对于一个合数,我们将小于等于这个合数平方根的质因子整除完之后,若 余下的书大于1,说明本合数存在并且仅存在一个大于这个合数的平方根的质因子*/ #include<iostream> #include<vector> #include<string> #include<math.h> using namespace std; const int maxn = 100000; int max_yinzi(int n) { int max =0; for(int i=2;i<=sqrt(1.0*n);i++)//从2到根号n求其质因数 { while(n%i==0) //因为一个质因数可能会乘多次,所以应该用while,而不是if { max = i; //让max指向当前最大值 n /= i; //除以质因数 } if(n==1) break; } if(n!=1) //如果n不等于1,说明存在一个大于根号n的质因数,有且仅有一个,即等于当前的n max = n; return max; } int main() { int n; vector<string> str; char ch[101]; string temp; int sum; double count; while(cin>>n) { str.clear();//清空 getchar(); //用在gets()之前 for(int i=0;i<n;i++) { gets(ch); //考虑到输入可能有空格 str.push_back(ch); } for(int i=0;i<n;i++)//对str中每一个字符串进行分析 { sum = 0; count = 0; temp = str[i]; for(int j = temp.length()-1;j>=0;j--) //从后往前, { if(temp[j]>='0'&&temp[j]<='9') { sum += (temp[j] -'0')*pow(10.0,count); count++; } } cout<<max_yinzi(sum)<<endl; } } return 0; } D #include<iostream> #include<algorithm> #include<string> #include<string.h> using namespace std; struct node{ char data; struct node *lchild,*rchild; node(char ch) { data = ch; lchild = rchild = NULL; } }*BiTree; node* createTree(string str_pre,string str_in) { int len = str_pre.length(); if(len<=0) return NULL; node* T = new node(str_pre[0]); int val = str_in.find(str_pre[0]); T->lchild = createTree(str_pre.substr(1,val),str_in.substr(0,val)); T->rchild = createTree(str_pre.substr(val+1,len-val-1),str_in.substr(val+1,len-val-1)); return T; } void postOrder(node * T) { if(T!=NULL) { postOrder(T->lchild); postOrder(T->rchild); cout<<T->data; } } int main() { string str_pre;//先序 string str_in;//中序 cin>>str_pre; cin>>str_in; node * T = createTree(str_pre,str_in); postOrder(T); return 0; } E #include<iostream> #include<stack> #include<string> using namespace std; int main() { //变量定义 int n; string str; bool flag = true;//标志位,判断 char ch; cin>>n; //个数 while(n--) { stack<char> S;//初始化一个栈,存储符号 cin>>str; //对字符串进行操作 for(int i =0;i<str.length();i++) { //当为左括号是就入栈 if(str[i] == '('||str[i] == '['||str[i] == '{') S.push(str[i]); //当为右括号是分情况讨论 if(str[i] == ')') { if(S.empty())//若栈为空则不匹配 { flag = false; break; } ch = S.top();//在获取top之前必须判断栈是否为空 if(ch == '(') { flag = true; S.pop();//匹配则出栈 } else { flag = false; break; } } if(str[i] == ']') { if(S.empty()) { flag = false; break; } ch = S.top(); if(ch == '[') { flag = true; S.pop(); } else { flag = false; break; } } if(str[i] == '}') { if(S.empty()) { flag = false; break; } ch = S.top(); if(ch == '{') { flag = true; S.pop(); } else { flag = false; break; } } } if(flag == true&&S.empty())//判断栈空目的:"()("也为不匹配 cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; } 2011 A #include<iostream> #include<algorithm> using namespace std; int main() { int a[1001]={0}; int b[1001]={0}; int i=0; int temp; int sum; //输入 while(1) { cin>>a[i]; if(a[i]==0)//输入0结束 break; i++;//计数,共i个数 } //对输入的每个数求各个数字之和 for(int j=0;j<i;j++) { temp = a[j]; sum = 0; while(temp) { sum += temp%10; temp /= 10; } b[j] = sum;//结果存到b数组中 } sort(b,b+i);//排序 for(int j=0;j<i-1;j++) cout<<b[j]<<" "; cout<<b[i-1]<<endl; return 0; } B #include<iostream> using namespace std; struct Ma{ int x; int y; int num; }an[100]; int main() { int m,n;//行数、列数 int a[101][101]={0}; int min_hang; int temp; bool flag; int x; while(cin>>m>>n) { //初始化 //输入矩阵 for(int i=0;i<m;i++) { for(int j=0;j<n;j++) { cin>>a[i][j]; } } //初始化 min_hang = a[0][0]; temp = 0; x = 0;//记录马鞍点个数 for(int i=0;i<m;i++) { //找每一行最小值 for(int j=0;j<n;j++) { if(min_hang>a[i][j]) { min_hang = a[i][j]; temp = j;//记录所在列数 } } //判断是不是所在列的最大值,temp记录每一行最小值的列 for(int k=0;k<m;k++) { if(min_hang<a[k][temp]) { flag = false; break; } } //如果是马鞍点就把他加入到an数组中 if(flag) { an[x].x = i; an[x].y = temp; an[x].num = min_hang; x++; } //恢复标志位 min_hang = a[i+1][0]; flag = true; } for(int i=0;i<x;i++) cout<<an[i].x<<" "<<an[i].y<<" "<<an[i].num<<endl; } return 0; } C //字符串压缩 #include<iostream> #include<string> #include<math.h> using namespace std; int main() { string str; string str2; int sum; int count; while(cin>>str) { sum = 0; count = 0; str2 = ""; for(int i=str.length()-1;i>=0;i--) { if(str[i]>='0'&&str[i]<='9') { sum += (str[i]-'0') * pow(10.0,count); count++; } else{ if(sum==0) str2+=str[i]; else{ for(int j=0;j<sum;j++) str2+=str[i]; } sum = 0; count=0; } } for(int i=str2.length()-1;i>=0;i--) cout<<str2[i]; cout<<endl; } return 0; } D //求哈夫曼树带权路径长度 //算法思想参考算法笔记344-345页 #include<iostream> #include<queue> #include<functional> //greater using namespace std; int main() { int n; int w; int x,y; int WPL = 0; priority_queue<int,vector<int>,greater<int> > q;//定义一个优先级队列,从小到大 while(cin>>n) { //清空优先级队列 while(!q.empty()) q.pop(); while(n--) { cin>>w; q.push(w); } while(q.size()>1) { x = q.top();//取第一小元素 q.pop(); y = q.top();//取第二小元素 q.pop(); q.push(x+y);//两者相加后加入优先级队列 WPL += x + y;//为什么直接相加就能得到最短带权路径长度?因为每一次相加后又压入了队列中,所以每次相加把之前的权值也加上了 } cout<<WPL<<endl; } return 0; } 2013 A #include<iostream> using namespace std; int F(int n) { if(n==0) return 7; else if(n==1) return 11; else return F(n-1)+F(n-2); } int main() { int N; int n; cin>>N; while(N--) { cin>>n; if(F(n)%3==0) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; } B #include<iostream> #include<map> using namespace std; map<int,int> number; int main() { int index; for(int i=0;i<20;i++) { cin>>index; number[index]++; } for(map<int,int>::iterator it=number.begin();it!=number.end();it++) { cout<<it->first<<":"<<it->second<<endl; } return 0; } C D #include<iostream> #include<math.h> #include<stack> #include<string> using namespace std; //二进制转换十进制 int Binary(int n) { int sum = 0; int count =0; while(n) { sum += (n %10) * pow(2.0,count); n /= 10; count++; } return sum; } //十进制转二进制 string Decimal(int n) { stack<int> S; string str = ""; int count = 0; while(n) { S.push(n%2); n /= 2; } while(!S.empty()) { str += S.top() + '0'; S.pop(); } return str; } int main() { int n;//数 int m;//进制 while(cin>>n>>m) { if(n==0&&m==0) break; if(m == 2) { cout<<Binary(n)<<endl; } else { cout<<Decimal(n)<<endl; } } return 0; } 2015 A //求一串数中大于1的素数 #include<iostream> #include<math.h> #include<string> #include<string.h> using namespace std; //判断是否是素数 bool isPrime(int n) { for(int i=2;i<=sqrt((double)n);i++) if(n%i==0) return false; return true; } int main() { char ch[200]; int num[200]={0}; int result[200] = {0}; string str; int count; int sum; int j; int index=0; while(gets(ch)) {//输入,接受每一行的数据 if(ch[0]=='0') //输入0返回 break; str = ch; sum = 0; count = 0; j = 0; for(int i=str.length()-1;i>=0;i--) //从后往前遍历,把每一个数提取出来,存放到num数组中 { if(str[i]>='0'&&str[i]<='9') //数字 { sum += (str[i] - '0')*pow(10.0,count); count++; } else{ //空格 num[j] = sum; j++; count = 0; sum = 0; } if(i==0) num[j] = sum; } sum = 0;//素数和 for(int i=0;i<=j;i++) { if(isPrime(num[i])&&num[i]!=1) sum+=num[i]; } result[index] = sum;//记录每一组数的结果 index++; // } for(int i=0;i<index;i++) cout<<result[i]<<endl; return 0; } B #include<iostream> #include<string> using namespace std; int main() { string str; string str2 = ""; int count; while(cin>>str) { count = 1; str2 = ""; for(int i= 0;i<str.length();i++) { if(str[i] == str[i+1]) { count++; } else{ if(count==1) str2 += str[i]; else { str2 += count +'0'; str2 += str[i]; } count = 1; } } cout<<str2<<endl; } return 0; } C #include<iostream> using namespace std; int main() { int row,col,start; char maze[11][11]={''}; while(cin>>row>>col>>start) { if(row==0&&col==0&&start==0) return 0; for(int i=1;i<=row;i++) for(int j=1;i<=col;j++) cin>>maze[i][j]; int i = 1; int j = start; int count = 0; while(i>=1&&i<=row&&j>=1&&j<=col) { if(maze[i][j]=='N') i = i-1; else if(maze[i][j]=='W') j -= 1; else if(maze[i][j]=='S') i -= 1; else j += 1; count++; } cout<<count<<endl; } return 0; }#include<iostream> using namespace std; int main() { int row,col,start; char maze[11][11]={''}; while(cin>>row>>col>>start) { if(row==0&&col==0&&start==0) return 0; for(int i=1;i<=row;i++) for(int j=1;i<=col;j++) cin>>maze[i][j]; int i = 1; int j = start; int count = 0; while(i>=1&&i<=row&&j>=1&&j<=col) { if(maze[i][j]=='N') i = i-1; else if(maze[i][j]=='W') j -= 1; else if(maze[i][j]=='S') i -= 1; else j += 1; count++; } cout<<count<<endl; } return 0; } D #include<iostream> #include<fstream> //引用文件输入输出库 #include<string> #include<algorithm> using namespace std; struct Score{ string ID; int question_num; int score; friend bool operator <(Score a,Score b) //重载小于号,定义排序规则 { if(a.question_num != b.question_num) return a.question_num>b.question_num; else return a.score<b.score; } }Stu_score[100]; int main() { ifstream infile; //从文件输入,读取文件内容 ofstream outfile; //输出到文件 int i = 0; infile.open("Score.txt",ios::in);//打开文件 outfile.open("Order.txt"); if(!infile) //打开失败 { cout<<"open failed"<<endl; exit(1); } while(!infile.eof()) { infile>>Stu_score[i].ID>>Stu_score[i].question_num>>Stu_score[i].score;//文件流输入结构体中 i++; } sort(Stu_score,Stu_score+i);//排序 for(int j=0;j<i;j++) outfile<<j+1<<" "<<Stu_score[j].ID<<" "<<Stu_score[j].question_num<<" "<<Stu_score[j].score<<endl; infile.close(); outfile.close(); return 0; } 2017 A #include<iostream> #include<algorithm> using namespace std; int main() { int n; int a[100] = {0}; while(cin>>n) { for(int i=0;i<n;i++) { cin>>a[i]; } sort(a,a+n); if(n%2 == 0&&a[n/2-1] == a[n/2]) { cout<<a[n/2-1]<<endl; } else if(n%2 != 0 && a[n/2-1] != a[n/2] &&a[n/2+1] != a[n/2]) { cout<<a[n/2]<<endl; } else cout<<-1<<endl; } return 0; } B #include<iostream> #include<vector> #include<string> #include<math.h> using namespace std; vector<string> strs; //朴素的串匹配算法 bool String_match(string c,string str,int option)//str是子串 { int i =0; int j = 0; while(i<c.length()&&j<str.length()) //注意循环条件 { if(option == 1) //1表示对大小写敏感 { if(c[i] == str[j]) //如果当前字符匹配,就往下走 { i++; j++; } else //否则回溯 { i = i-j+1; j = 0; } } else //对大小写不敏感 { if(c[i]==str[j] || abs(c[i]-str[j]) == 32) //如果当前字符匹配或者是大小写关系,小写字母比大写字母要大32 { i++; j++; } else //否则回溯 { i = i-j+1; j = 0; } } } if(j>=str.length()) //子串遍历完说明匹配成功 return true; else return false; } int main() { string str; int option;//大小写敏感选项 int n;//字符串个数 string temp; while(cin>>str) { strs.clear(); cin>>option;//0对大小写不敏感,1对大小写敏感 cin>>n;//组数 for(int i=0;i<n;i++) { cin>>temp; strs.push_back(temp); } if(option == 1) { for(int i=0;i<n;i++) { temp = strs[i]; if(String_match(temp,str,1)) cout<<temp<<endl; } } else { for(int i=0;i<n;i++) { temp = strs[i]; if(String_match(temp,str,0)) cout<<temp<<endl; } } } return 0; } #include<iostream> using namespace std; //KMP算法 void getnext(int next[],char t[]) { int i=0; int j=-1; next[0] = -1; while(t[i]!='