1.字符串处理:从 string.in文件里读入两个字符串,字符串除了数字还可能包括 ‘—‘、’E’、’e’、’.’,相加之后输出到文件 string.out中,如果是浮点型,要求用科学计数法表示(最多包含 10个有效数字)。
#include<iostream>
#include<string>
#include<cstdio>
#include<fstream>
#include<cstdlib>
#include<math.h>
using namespace std;
int main(){
ifstream infile("in.txt");
string s1,s2;
double x,y;
getline(infile,s1);
getline(infile,s2);
if(s1.find('e')!=string::npos||s1.find('E')!=string::npos){
if(s1.find('e')!=string::npos){
int pos=s1.find('e');
double a=atof((char*)s1.substr(0,pos).data());//底数
double b=atof((char*)s1.substr(pos+1).data());//次数
x=a*pow(10,b);
}
else{
int pos=s1.find('E');
double a=atof((char*)s1.substr(0,pos).data());//底数
double b=atof((char*)s1.substr(pos+1).data());//次数
x=a*pow(10,b);
}
}
else{
x=atof((char*)s1.data());
}
if(s2.find('e')!=string::npos||s2.find('E')!=string::npos){
if(s2.find('e')!=string::npos){
int pos=s2.find('e');
double a=atof((char*)s2.substr(0,pos).data());//底数
double b=atof((char*)s2.substr(pos+1).data());//次数
y=a*pow(10,b);
}
else{
int pos=s2.find('e');
double a=atof((char*)s2.substr(0,pos).data());//底数
double b=atof((char*)s2.substr(pos+1).data());//次数
y=a*pow(10,b);
}
}
else{
y=atol((char*)s2.data());
}
printf("%e",x+y);
infile.close();
}
2.最大公约数:从 number.in文件中读入 n个数,求出这 n个数的最小值、最大值以及它们两的最大公约数,输出到文件 number.out中。number.in中第一行为 n,接下来为 n个大于零的整数。
#include<iostream>
#include<algorithm>
#include<fstream>
#include<cstdlib>
#include <sstream>
using namespace std;
const int MAXN=100;
int a[MAXN];
//若是最小公倍数则是两数乘积除以它们的最大公约数
int gcd(int a,int b){//
if(b==0) return a;
else return gcd(b,a%b);
}
int main(){
ifstream infile("in.txt");
string s;
getline(infile,s);
int n=atoi((char*)s.data());
getline(infile,s);
stringstream stringin(s);//实现按空格读取,需要导入sstream文件
int i=0;
while(stringin>>a[i]){
i++;
}
sort(a,a+n);
int Min=a[0],Max=a[n-1];
cout<<Min<<" "<<Max<<" "<<gcd(Min,Max);
}
3.任务调度:从 task.in文件中读入任务调度序列,输出 n个任务适合的一种调度方式到 task.out中。每行第一个表示前序任务,括号中的任务为若干个后序任务,表示只有在前序任务完成的情况下,后序任务才能开始。若后序为 NULL则表示无后继任务。
#include<iostream>
#include<fstream>
#include<vector>
#include<queue>
#include<string>
#include<cstdlib>
#include<cstring>
using namespace std;
const int MAXN=500;
vector<int> graph[MAXN];
int indegree[MAXN];
vector<int> TopologicalSort(int n){
vector<int> topology;
priority_queue<int,vector<int>,greater<int> > q;//逆向优先队列,为了实现拓扑序列不唯一时编号小的在前面
for(int i=0;i<n;i++){
if(indegree[i]==0) q.push(i);
}
while(!q.empty()){
int T=q.top();
topology.push_back(T);
q.pop();
for(int i=0;i<graph[T].size();i++){
int v=graph[T][i];
indegree[v]--;
if(indegree[v]==0) q.push(v);
}
}
return topology;
}
int main(){
ifstream infile("in.txt");
string s;
memset(indegree,0,sizeof(indegree));
int Count=0;
while(getline(infile,s)){
Count++;
int pos=s.find("Task");
int T=atoi((char*)s.substr(pos+4,1).data());
s=s.substr(pos+5);
while(s.find("Task")!=string::npos){
int pos1=s.find("Task");
int p=atoi((char*)s.substr(pos1+4,1).data());
indegree[p]++;
graph[T].push_back(p);
s=s.substr(pos1+5);
}
}
vector<int> v=TopologicalSort(Count);
for(int i=0;i<v.size();i++){
cout<<"Task"<<v[i]<<" ";
}
}
4.火车票订购:火车经过 X站,火车最大载客人数为 m,有 n个订票请求,请求订购从 a站到 b站的 k张票,若能满足订购要求则输出 1,否则输出 0。数据从 ticket.in中输入,第一行有四个数,分别为 n,m。接下来有 n行,每行三个数分别为 a,b,k。结果输出到文件 ticket.out中
#include<iostream>
#include<fstream>
#include<sstream>
using namespace std;
const int MAXN=100;
int station[MAXN];
int n,m;
int result[MAXN];
bool jugde(int a,int b,int k){
bool flag=true;
for(int i=a;i<=b;i++){
if(station[i]+k>m){
flag=false;
break;
}
}
return flag;
}
int main(){
string s;
ifstream infile("in.txt");
getline(infile,s);
stringstream stringin(s);
stringin>>n; stringin>>m;
int j=0;
for(int i=0;i<n;i++){
int a,b,k;
getline(infile,s);
stringstream stringin1(s);
stringin1>>a; stringin1>>b; stringin1>>k;
if(jugde(a,b,k)){
for(int i=a;i<=b;i++){
station[i]+=k;
}
result[j++]=1;
}
else{
result[j++]=0;
}
}
infile.close();
ofstream outfile("out.txt");
for(int i=0;i<n;i++){
outfile<<result[i]<<endl;
}
outfile.close();
}
5.最短路径:有 n个城市 m条道路(n<1000, m<10000),每条道路有个长度,请找到从起点 s到终点 t的最短距离,并且输出经过的城市的名,如果有多条,输出字典序最小的那条;若从 s到 t没有路径,则输出“can’t arrive”。从 road.in中读入数据,第一行有四个数,分别为 n,m,s,t。接下来 m行,每行三个数,分别为两个城市名和距离。输出结果到 road.out中。
#include<iostream>
#include<fstream>
#include<queue>
#include<sstream>
#include<cstring>
#include<climits>
#include<cstdio>
using namespace std;
const int INF=INT_MAX;
//
struct Edge{
int to;
int length;
Edge(int to,int length):to(to),length(length){}
};
const int MAXN=100;
vector<Edge> graph[MAXN];
int dis[MAXN];//存的最小距离
int path[MAXN];//path[j]=i表示从i到j最短路的路径
struct Point{
int number;
int distance;//到源点距离
Point(int n,int d):number(n),distance(d){}
bool operator< (const Point& e) const{
return distance<e.distance;
}
};
void Dijkstra(int s){
priority_queue<Point> q;//若是逆向从时要对Point中的>进行重载
dis[s]=0;
q.push(Point(s,dis[s]));
while(!q.empty()){
int u=q.top().number;//距离源点最近的点
q.pop();
for(int i=0;i<graph[u].size();i++){
int v=graph[u][i].to;
int d=graph[u][i].length;
if(dis[v]>dis[u]+d){//所以初始化应该是无穷
dis[v]=dis[u]+d;
q.push(Point(v,dis[v]));
path[v]=u;//由u到v是最短
}
}
}
return ;
}
int main(){
int n,m,s,t;
ifstream infile("in.txt");
string str;
getline(infile,str);
stringstream in(str);
in>>n; in>>m; in>>s; in>>t;
memset(graph,0,sizeof(graph));
//对int数组用fill初始化
fill(dis,dis+MAXN,INF);//注意初始化的范围
fill(path,path+MAXN,-1);
//cout<<n<<" "<<m<<" "<<s<<" "<<t<<endl;
for(int i=0;i<m;i++){
int a,b,l;
getline(infile,str);
stringstream in(str);
in>>a; in>>b; in>>l;
graph[a].push_back(Edge(b,l));
graph[b].push_back(Edge(a,l));
}
Dijkstra(s);
cout<<dis[t]<<endl;
vector<int> v;
while(path[t]!=-1){
v.push_back(t);
t=path[t];
}
v.push_back(s);
for(int i=v.size()-1;i>=0;i--){
cout<<v[i]<<" ";
}
}