做题的时候发现今年的题目都出现差错了,体验掉星。
下午刚考完,官网还没放出题目,静等分数。放一下今下午撸的代码,祝我做的都对,祝祝祝!
第一题
#include <iostream>
#include <map>
#include <stack>
#include <queue>
#include <string>
#include <set>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <sstream>
#include <iomanip>
using namespace std;
int n;
int data[100005];
int main()
{
double mid_n;
int min_n,max_n,mid_temp;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>data[i];
}
min_n=min(data[0],data[n-1]);
max_n=max(data[0],data[n-1]);
if(n%2)
{
mid_temp=data[n/2];
printf("%d %d %d\n",max_n,mid_temp,min_n);
}
else
{
mid_n=(data[n/2]+data[n/2-1])/2.0;
mid_temp=(data[n/2]+data[n/2-1])/2;
if(mid_n==mid_temp)
printf("%d %d %d\n",max_n,mid_temp,min_n);
else
printf("%d %.1f %d\n",max_n,mid_n,min_n);
}
}
return 0;
}
/*
3
-1 2 4
4
-1 -2 3 4
4
1 2 3 4
4
1 2 2 4
5
3 3 3 3 3
2
-2 -2
*/
一开始题目描述和给的样例不一致,让人头大,我就按照我自己的理解写了,后来果然按照我的理解,官方给出了修正。
第二题
#include <iostream>
#include <map>
#include <stack>
#include <queue>
#include <string>
#include <set>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <sstream>
#include <iomanip>
using namespace std;
string strs[105];
queue<char> q;
/*
#的优先级小于其他非#,其他非#的优先级大于#,#=#
+ - × /的优先级大于+ -
+ -的优先级小于× /
× /的优先级大于× /
a>b return 1
a<b return -1
a=b return 0
*/
int youxian(char a,char b)
{
if(a=='#'&&b!='#')
return -1;
if(b=='#'&&a!='#')
return 1;
if(b=='#'&&a=='#')
return 0;
if((a=='+'||a=='-')&&(!(b=='+'||b=='-')))
return -1;
return 1;
}
int calc(int a,int b,char c)
{
if(c=='+')
return a+b;
else if(c=='-')
return a-b;
else if(c=='/')
return a/b;
else
return a*b;
}
int getRes()
{
stack<int> opnd;
stack<char> optr;
optr.push('#');
char c;
char temp;
int a,b;
c=q.front();
q.pop();
while(c!='#'||optr.top()!='#')
{
if(c<='9'&&c>='0')
{
opnd.push(c-'0');
c=q.front();
q.pop();
}
else
{
switch(youxian(optr.top(),c))
{
case -1:
optr.push(c);
c=q.front();
q.pop();
break;
case 0:
optr.pop();
c=q.front();
q.pop();
break;
case 1:
temp=optr.top();
optr.pop();
b=opnd.top();
opnd.pop();
a=opnd.top();
opnd.pop();
opnd.push(calc(a,b,temp));
break;
}
}
}
return opnd.top();
}
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
cin>>strs[i];
}
for(int i=0;i<n;i++)
{
for(int j=0;j<strs[i].size();j++)
{
q.push(strs[i][j]);
}
q.push('#');
if(getRes()==24)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
return 0;
}
/*
10
9+3+4x3
5+4x5x5
7-9-9+8
5x6/5x4
3+5+7+9
1x1+9-9
1x9-5/9
8/5+6x9
6x7-3x6
6x4+4/5
*/
用string存下每一行,再一点点分解丢进queue,再从queue里一点点取front(),再丢向操作符和操作数的栈。最后终于调好了,感觉自己经历辛苦,做出来真棒。
要注意题目里不用乘号,而用小埃克斯x。
第三题
/*
毕竟是考试,
怎样得到最高的分数才是王道,
所以这道大模拟我就直接跳过了,
因为每次刷题都会在这里花很多时间,
如果有机会以后还要多练习,
希望能在有限的时间里做好第三题
*/
第四题
/*
思路:
对数据做处理
每输入一个R或者S都处理成一个节点
对于每一组输入(有n行)
每一行先有左边点,再有右边点。
每行之间现有相应的S,再有相应的R
所以我认为这道题把图构建出来,然后用拓扑来做就ok
拓扑成功表示没有死锁,否则,死锁。
但这道题在我还有5分钟就结束考试的时候去提交,系统已经关了
o(╥﹏╥)o心态不好了,最后也忘了拷贝回来这道题emmm
*/
第五题
#include <iostream>
#include <map>
#include <stack>
#include <queue>
#include <string>
#include <set>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <vector>
#include <sstream>
#include <iomanip>
using namespace std;
struct Dis//到index号的距离是dis
{
int dis;
int index;
};
const int INF=0x3f3f3f3f;
const int MAXN=10005;
int mp[MAXN][MAXN];
int dis[MAXN];
int isE[MAXN];//是否为发动机
int vis[MAXN];
Dis dis2[MAXN];
bool cmp(Dis d1,Dis d2)
{
return d1.dis<d2.dis;
}
int main()
{
int n,m,k;
int a,b,c,i,j;
while(cin>>n>>m>>k)
{
memset(mp,0x3f,sizeof(mp));
for(i=1;i<=n;i++)
{
mp[i][i]=0;
}
for(i=1;i<=n;i++)
{
cin>>isE[i];
}
for(i=0;i<m;i++)
{
cin>>a>>b>>c;
mp[a][b]=min(mp[a][b],c);
mp[b][a]=mp[a][b];
}
for( a=1;a<=n;a++)
{
//对于每一个点找最短路径
memset(dis,0x3f,sizeof(dis));
for(i=1;i<=n;i++)
{
dis[i]=mp[a][i];
}
memset(vis,0,sizeof(vis));
vis[a]=1;
int v,mi;
for(i=1;i<n;i++)
{
mi=INF;
for(j=1;j<=n;j++)
{
if(!vis[j]&&dis[j]<mi)
{
mi=dis[j];
v=j;
}
}
vis[v]=1;
for(j=1;j<=n;j++)
{
if(!vis[j]&&mi+mp[v][j]<dis[j])
{
dis[j]=mi+mp[v][j];
}
}
}
/*在这之前都是普通的迪杰斯特拉板子,
因为要求求出每一个节点的所有最短距离中的最短的几个距离,
所以还需要对最短距离们排序,不能直接对dis[]进行sort()
因为dis[]的下标是有意义的(节点号),
所以新造了Dis结构体,存储节点和距离,再对Dis排序
*/
int sum=0,count=0;
int dis2index=0;
for(i=1;i<=n;i++)
{
dis2[dis2index].dis=dis[i];
dis2[dis2index++].index=i;
}
sort(dis2,dis2+n,cmp);
for(i=0;i<n;i++)
{
if(isE[dis2[i].index]&&dis2[i].dis!=INF)
{
sum+=dis2[i].dis;
count++;
}
if(count==k)
break;
}
cout<<sum<<endl;
}
}
return 0;
}