哈尔滨营销型网站制作,怎么做网站的营销,东莞市新闻,网站设计简单吗文章目录#xff1a;
基础知识 什么是模拟#xff1f; 例题 一、错误票据 1.解题思路 2.代码 二、移动距离 1.解题思路 2.代码 三、航班时间 1.解题思路 2.代码 四、外卖优先级 1.解题思路 2.代码 前面为了目录好看大家就当个玩笑看吧哈哈哈。下面上正文。 正文 基础知识 什… 文章目录
基础知识 什么是模拟 例题 一、错误票据 1.解题思路 2.代码 二、移动距离 1.解题思路 2.代码 三、航班时间 1.解题思路 2.代码 四、外卖优先级 1.解题思路 2.代码 前面为了目录好看大家就当个玩笑看吧哈哈哈。下面上正文。 正文 基础知识 什么是模拟 模拟一个很宽泛的内容比如字符串处理日期处理。凡是不是很复杂但是没有标准归类的题目都可以称为模拟。
枚举和模拟是没有什么算法可言的按照题目说的意思去模拟一下即可要求对语法代码的熟练度比较高。
模拟题是有唯一解的而不是求最优解的问题只不过模拟题实现起来比较麻烦。 这个是引用某个大佬的内容 模拟算法是一种最基本的算法思想是对程序员基本编程能力的一种考查其解决方法就是根据题目给出的规则对题目要求的相关过程进行编程模拟。在解决模拟类问题时需要注意字符串处理、特殊情况处理和对题目意思的理解。我们知道在C语言中通常使用函数srand()和rand()来生成随机数。其中函数srand()用于初始化随机数发生器然后使用函数rand()来生成随机数。如果要使用上述两个函数则需要在源程序头部包含time.h文件。在程序设计过程中可使用随机函数来模拟自然界中发生的不可预测情况。在解题时需要仔细分析题目给出的规则要尽可能地做到全面地考虑所有可能出现的情况这是解模拟类问题的关键点。
二、错误票据
1.解题思路
步骤 ①输入都输入到一个数组中
本题比较坑的是注意输入只告诉了有多少行没告诉每行有多少个数。每行有多少个数需要自己处理 。
int a[100010];
int k0;
int x;
while(cinx) //这行会把每个出现的数都存到a[]数组中
{a[k]x;
}
②从小到大排序
③循环遍历数组
找重号如果相邻两个数相等那么这个就是重号
找断号 如果相邻的两个数相差2那么两数中间的就是断号
2.代码
做题先暴力下面是暴力代码
//另一种方法暴力模拟法#include iostream
#include algorithm
using namespace std;
int a[100010];
int main()
{int n;cinn;int k0;//第一步输入数据合并到一个数组中int x;while(cinx){a[k]x;}// for(int i0;ik;i) couta[i] ;//第二步排序sort(a,ak);//第三步求重号利用桶的思想找到第一个重复的数据记录int t[100010],ans20;for(int i0;ik;i){t[a[i]];}for(int i0;i100000;i){if(t[i]2){ans2i;break;}}//第四步求断号先给序列去重再利用下标和排好序的序列找断号注意边界int z[100010],j0;for(int i0;ik;i){if(a[i]a[i-1]) continue;else z[j]a[i];}//for(int i0;ij;i) coutz[i] ;int qz[0],ans10;for(int i0;ij;i){if(z[i]q) {q;continue; }else {ans1q;break;}}coutans1 ans2;return 0;}
下面这是正常做法
#include cstring
#include sstream
#include iostream
#include algorithmusing namespace std;const int N 10010;int n;
int a[N];int main()
{int cnt;cin cnt;string line;getline(cin, line); // 忽略掉第一行的回车while (cnt -- ){getline(cin, line);stringstream ssin(line);while (ssin a[n]) n ;}sort(a, a n);int res1, res2;for (int i 1; i n; i )if (a[i] a[i - 1]) res2 a[i]; // 重号else if (a[i] a[i - 1] 2) res1 a[i] - 1; // 断号cout res1 res2 endl;return 0;
}二、移动距离 1.解题思路 题目中遇到距离一般有两种曼哈顿距离 和 欧几里得距离
曼哈顿距离|x1-x2||y1-y2| 两点之间走过的折线距离 欧几里得距离sqrt((x1-x2) * (x1-x2)(y1-y2) * (y1-y2)) 两点间的直线距离
本题所有点的坐标其实就是行号和列号
可以借鉴c中二维数组的行号和列号下标表示让编号从0开始标号所以让mn一开始都-1不需要特判边界了。所以 行号n/w m/w 列号n%w m%w
又因为本题编号是蛇形递增1的所以只需要判断是奇数行还是偶数行
偶数行不用变奇数行逆序if n/w 是奇数 w-1-n%w2.代码
//时间复杂度O(1)
#include cstring
#include iostream
#include algorithmusing namespace std;int main()
{int w, m, n;cin w m n;m --, n -- ; //让编号从0开始int x1 m / w, x2 n / w; //两个点的行号int y1 m % w, y2 n % w; //两个点的列号if (x1 % 2) y1 w - 1 - y1; //第一个点行号如果是奇数行列号就反转一下if (x2 % 2) y2 w - 1 - y2; //第二个点行号如果是奇数行列号就反转一下cout abs(x1 - x2) abs(y1 - y2) endl; //求出两点之间的曼哈顿距离return 0;
}三、航班时间
1.解题思路
通过分析可以得到
飞行时间[(去的结束时间-去的起始时间)(回的结束时间-回的起始时间)]/2
步骤
①字符串格式化输入这道题目麻烦就是麻烦在字符串的格式处理上
getline(cin,line);//忽略第一行的回车int fh1,fm1,fs1,fh2,fm2,fs2,fd0;
scanf(%d:%d:%d %d:%d:%d (%d),fh1,fm1,fs1,fh2,fm2,fs2,fd);//注意输入时(%d)不匹配后就会跳过了②将所有时间转化为距离当天00:00:00的秒数得到飞行时间秒数time
int time1,time2,t;
time1fd*24*3600fh2*3600fm2*60fs2-(fh1*3600fm1*60fs1);
time2ed*24*3600eh2*3600em2*60es2-(eh1*3600em1*60es1);
t(time1time2)/2;③再将飞行时间time转化为00:00:00这一规定时间格式
hourtime/3600;
minutetime%3600/60
secondtime%3600%60④格式化输出
printf(%02d:%02d:%02d\n, t/3600, t%3600/60, t%3600%60);2.代码
#includeiostream
#include cstdio
using namespace std;int main()
{int n;cinn;while(n--){//输入去的时候起始时间和结束时间int fh1,fm1,fs1,fh2,fm2,fs2,fd0;scanf(%d:%d:%d %d:%d:%d (%d),fh1,fm1,fs1,fh2,fm2,fs2,fd);//输入回的时候起始时间和结束时间int eh1,em1,es1,eh2,em2,es2,ed0;scanf(%d:%d:%d %d:%d:%d (%d),eh1,em1,es1,eh2,em2,es2,ed);//计算两次分别的飞行时间和除以2为最终的飞行时间int time1,time2,t;time1fd*24*3600fh2*3600fm2*60fs2-(fh1*3600fm1*60fs1);time2ed*24*3600eh2*3600em2*60es2-(eh1*3600em1*60es1);t(time1time2)/2;//将秒数转化为规定格式输出printf(%02d:%02d:%02d\n, t/3600, t%3600/60, t%3600%60);}return 0;
}//封装为函数#includeiostream
#includecstdio
using namespace std;
int getTime()
{int h1,m1,s1,h2,m2,s2,d0;scanf(%d:%d:%d %d:%d:%d (%d),h1,m1,s1,h2,m2,s2,d);int timed*24*3600h2*3600m2*60s2-(h1*3600m1*60s1);return time;
}
int main()
{int t;scanf(%d,t);for(int i 0; i t; i){int time1getTime();int time2getTime();int t(time1time2)/2;printf(%02d:%02d:%02d\n, t/3600, t/60%60, t%60);}return 0;
}四、外卖优先级
1.解题思路 伪代码如下
score[i]:表示第i个店铺当前的优先级
last[i]: 表示第i个店铺上一次有订单的时刻
st[i]:表示第i个店铺当前是否处于优先缓存中将所有订单按时间顺序排序;
for 每个订单
{每次处理一批相同的订单;id,t,cnt;//第一部分是上一个拿到订单的时间last[id]和t之间中间没订单所以要−1没订单的数量是t−last[i]−1 (比如第3和第6时刻都有订单没有订单的时候就是4,5)score[id]t-last[id]-1;if(score[id]0) score[id]0;//计算优先权如果为负值更新为0。如果小于等于3更新优先缓存 st[id]falseif(score[id]3) st[id]false;//第二部分是此时tt时刻拿到订单并且拿到的数量为cntcnt要加上2∗cntscore[id]cnt*2;if(score[id]5) st[id]true;//计算优先权如果大于5更新优先缓存 st[id]true
}
for(int i1;in;i)
{if(last[i]T) {score[i]-T-last[i];if (score[i] 3) st[i] false;}
}res 0;
for(int i1;in;i)
{resst[i];
}
2.代码
#include cstdio
#include cstring
#include iostream
#include algorithm#define x first
#define y secondusing namespace std;typedef pairint, int PII;const int N 100010;int n, m, T;
int score[N], last[N];
bool st[N];PII order[N];int main()
{scanf(%d%d%d, n, m, T);for (int i 0; i m; i ) scanf(%d%d, order[i].x, order[i].y);sort(order, order m);for (int i 0; i m;){int j i;while (j m order[j] order[i]) j ;int t order[i].x, id order[i].y, cnt j - i;i j;
/*
while (j m order[j] order[i]) j ;和cnt j - i;是为了算出来同一时刻同一家店的订单数量数量就是cnt的值这个数量可能不唯一。
第一次while()循环中的order[j] order[i]是一定成立的然后j j 就变成 i 1再比较order[i]和order[i 1]是否相等含义就是下一个订单与当前这个订单是不是同一时刻同一家店的直到时刻或者 id 不同时结束while循环最后 j 就指向“不重复”的第一个订单然后令 i j继续枚举所有订单
写成int j i 1;其它语句都不改动也是对的我感觉更好理解
*/score[id] - t - last[id] - 1;if (score[id] 0) score[id] 0;if (score[id] 3) st[id] false; score[id] cnt * 2;if (score[id] 5) st[id] true;last[id] t;}for (int i 1; i n; i )if (last[i] T){score[i] - T - last[i];if (score[i] 3) st[i] false;}int res 0;for (int i 1; i n; i ) res st[i];printf(%d\n, res);return 0;
}最近博主有事暂且停更一天一篇博客确实很有压力的所以说待博主沉淀亿下给大家更多优质内容哈哈哈元旦过后见