您的位置:首页 > 理论基础

2010年上海交通大学计算机研究生机试真题

2016-04-09 19:53 369 查看

题目1099:后缀子串排序

题目描述:

对于一个字符串,将其后缀子串进行排序,例如grain

其子串有:

grain

rain

ain

in

n

然后对各子串按字典顺序排序,即:

ain,grain,in,n,rain

输入:
每个案例为一行字符串。

输出:
将子串排序输出

样例输入:
grain


样例输出:
ain
grain
in
n
rain


<pre name="code" class="cpp">#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string str;
string arr[100];
while(cin >> str){
int len = str.length();
for(int i=0; i<len; i++)
arr[i] = str.substr(len-i-1,len);//substr(i,n)获得字符串str中 从第i位开始的长度为n的字符串.
sort(arr,arr+len);//从小到大排序
for(int i=0; i<len; i++)
cout << arr[i] << endl;
}
return 0;
}




题目1101:计算表达式

题目描述:
对于一个不存在括号的表达式进行计算

输入:
存在多种数据,每组数据一行,表达式不存在空格

输出:
输出结果

样例输入:
6/2+3+3*4


样例输出:
18


//思路:就是如果遇到减就把原来的数变成其相反数,对于乘除运算就直接先运算,总之最后直接将所有的进行相加就好
#include<iostream>
#include<cstdio>
using namespace std;
int main()
{
int i,j;//a是数字
char c;//输入运算符
double  b[100],temp;
while(scanf("%lf",&temp)!=EOF)//cin>>temp就不对,scanf就是对的。不明觉厉,还有木有!=EOF就超时
{
b[0]=0;
b[1]=temp;
i=1;
while(scanf("%c",&c)!=EOF && c!='\n')
{
scanf("%lf",&temp);
if(c=='+')
b[++i]=temp;
else if(c=='-')
b[++i]=-1*temp;
else if(c=='*')
b[i]=b[i]*temp;
else if(c=='/')
b[i]=b[i]*1.0/temp;

}
for(j=1;j<=i;j++)
b[0]+=b[j];
cout<<b[0]<<endl;
}
return 0;
}


题目1102:最小面积子矩阵

题目描述:
一个N*M的矩阵,找出这个矩阵中所有元素的和不小于K的面积最小的子矩阵(矩阵中元素个数为矩阵面积)

输入:
每个案例第一行三个正整数N,M<=100,表示矩阵大小,和一个整数K

接下来N行,每行M个数,表示矩阵每个元素的值

输出:
输出最小面积的值。如果出现任意矩阵的和都小于K,直接输出-1。

样例输入:
4 4 10
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16


样例输出:
1


//暴力求解
#include<iostream>
#include<cstdio>
using namespace std;
int a[100][100];
int n,m,k,ok,sum;
void solve(int i,int j)
{
int q,p,temp;
for(p=i;p<n;p++)
{
for(q=j;q<m;q++)
{
if(ok&&((p-i+1)*(q-j+1)>=sum))//ok=1表示之和大于K,(p-i+1)*(q-j+1)表示矩阵元素的个数
break;
temp=0;
for(int x=i;x<=p;x++)
for(int y=j;y<=q;y++)
temp+=a[x][y];
if(temp>=k)
{
ok=1;
sum=(p-i+1)*(q-j+1);
}
}
}
}
int main()
{
// freopen("datain.txt","r",stdin);
//freopen("dataout.txt","w",stdout);
while(cin>>n>>m>>k)
{
sum=0;
ok=0;
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
cin>>a[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
solve(i,j);//以(i,j)为左上方的顶点进行计算。
if(ok)
cout<<sum<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: