电子科技大学-经济与管理学院-SME杯-ACM竞赛解题报告
摘要
先说一下个人感受吧。
首先所有的题目确实不难,几乎全是模拟题,也就是说不需要任何NOIP的知识就能够解题,只要你能够找到比较好的解题思路,再把它用程序写出来就行。最多最多就考察了一个读入优化和一个单调队列。
然后就是…
既然题目这么简单怎么我的成绩还是那么惨不忍睹啊orz(很久没练了完全不会审题了)
好了下面是真经报告:
题目讲解
A题
- 题意分析:
本题要求我们从一个数列中选择至少一个数出来 ,并且选出的数的和最少为X,极差最大为d,询问最少有多少种选法。 - 解题思路:
很明显这道题用DFS是最快最简单的算法:首先让数组从小到大排列再依次枚举数,DFS时记录这个最开始枚举的数并同时计算和和极差,满足则继续向后枚举,不满足则退回起点枚举下一个数。
BFS也可以做,但是懒得打代码了(X) - 注意事项:
注意此题要用long long,不要头铁全用int - AC代码:
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int n,ans=0;
long long minv,maxd;
int num[20];
int jud[20];
void getans(int pos,long long sum,long long mnn)//通过子函数嵌套实现DFS,保存当前位置pos,本次枚举总和sum,起始数mnn
{
if(sum>=minv)ans++;
for(int i=pos+1;i<=n;i++)
if(num[i]-mnn<=maxd)
getans(i,sum+num[i],mnn);
}
int main()
{
cin >> n >> minv >> maxd;
for(int i=1;i<=n;i++)cin>>num[i];
sort(num+1,num+n+1);
for(int i=1;i<=n;i++)getans(i,num[i],num[i]);
cout << ans << endl;
}
B题
- 题意分析:
本题要求我们计算从一个坐标移动到另一个坐标所需要的最小步数。 - 解题思路:
很明显直接横坐标之差加上纵坐标之差就行了
没有人用BFS吧 - 注意事项:
如果要用stl的abs()函数记得引用头文件cmath - AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int t;
int xx1,yy1,xx2,yy2;
int main()
{
cin >> t;
while(t--)
{
cin >> xx1 >> yy1 >> xx2 >> yy2;
cout << abs(xx2-xx1)+abs(yy2-yy1) << endl;
}
}
C题
- 题意分析:
本题要求我们计算从一个坐标移动到另一个坐标所需要的Z最简指令及步数。 - 解题思路:
这个题可以算一道有点难度的模拟题了。
为了简化判断,我选择先把机器人统一朝向北面。(如果不这么干而是直接解对于我来说不仅想着头大,代码实现也头大)然后再统一处理当终点分别在机器人的8个方位上如何走,如何输出答案。最后你会发现对于一个方向最简指令的格式与步数是唯一的。 - 注意事项:
第一个是这里:
【N for North, S for South, E for East, or O for West】
注意O才是朝西,不是W也不是0。
第二个是当终点在机器人左上方的时候最简指令是先向前走,而不是先转三圈。这样最长只需要5个指令而不是六个。
(在这两处跌倒了无数次orz) - AC代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
char d;
int xx1,yy1,xx2,yy2;
int x,y;
void getposition()
{
if(d=='N'){
x=xx2-xx1;y=yy2-yy1;}
else if(d=='S'){
x=xx1-xx2;y=yy1-yy2;}
else if(d=='O'){
x=yy2-yy1;y=xx1-xx2;}
else if(d=='E'){
x=yy1-yy2;y=xx2-xx1;}
}
int main()
{
cin >> xx1 >> yy1 >> d >> xx2 >> yy2;
getposition();
if(x>0)
{
if(y>0)
{
cout<<3<<endl<<"A "<<y<<endl<<"D"<<endl<<"A "<<x;}
else if(y<0)
{
cout<<4<<endl<<"D"<<endl<<"A "<<x<<endl<<"D"<<endl<<"A "<<-y;}
else
{
cout<<2<<endl<<"D"<<endl<<"A "<<x;}
}
else if(x<0)
{
if(y>0)
{
cout<<5<<endl<<"A "<<y<<endl<<"D"<<endl<<"D"<<endl<<"D"<<endl<<"A "<<-x;}
else if(y<0)
{
cout<<5