原题链接:蓝桥杯历届试题-蚂蚁感冒
唉,自己根据题目模拟蚂蚁只得了40分,看的别人答案才发现可以把碰头的蚂蚁掉头看成穿过!且因为速度相同,不存在追上的问题;
这样问题就变得很简单了;
此时题目给出的100cm的长度就已经可以忽略了,即使是无限长,被感染的蚂蚁数量也不变;
因为不用思考每只蚂蚁掉头的后的复杂情况,所以一开始只要是跟感染源对着走的蚂蚁就会被感染;
例如第一只蚂蚁x = 10 是感染源,向右走,那么在x右边的且向左走的蚂蚁就一定会遇见x,就一定会被感染,
接着右边的蚂蚁继续向左走,那么在x左边的且向右走的蚂蚁就一定会跟他们相遇
特殊情况,当x的右边没有向左走的蚂蚁时,即在x的右边包括x在内都是向右走的,那么他们就一直保持原来的距离一直走,
永远不可能相遇感染,那么在x左边的蚂蚁也永远不可能追上x被感染;
所以,当x > 0时,x左边的蚂蚁被感染的条件是 : x右边有被感染的的蚂蚁
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int n;
int ans = 1;//加上感染源
int a[55];
cin>>n;
for(int i = 0; i < n; i++){
cin>>a[i];
}
int x = a[0];
if(x > 0){
for(int i = 1; i < n; i++){
if(abs(a[i]) > x){
if(a[i] < 0){
ans++;
}
}
}
if(ans > 0){ //当右边有被感染的,左边的才能被感染
for(int i = 1; i < n; i++){
if(abs(a[i]) < x){
if(a[i] > 0){
ans++;
}
}
}
}
}
if(x < 0){
for(int i = 1; i < n; i++){
if(abs(a[i]) < abs(x)){
if(a[i] > 0){
ans++;
}
}
}
if(ans > 0){ //当左边有被感染的,右边的才能被感染
for(int i = 1; i < n; i++){
if(abs(a[i]) > abs(x)){
if(a[i] < 0){
ans++;
}
}
}
}
}
cout<<ans;
return 0;
}下面的时我模拟的蚂蚁,只得了四十分,我也找不到哪里有问题
#include<iostream>
#include<algorithm>
using namespace std;
int a[10000];
int vis[10000];//感冒
int v[10000];//是否走出去了
int n, ans;
int f(){//是否全走出来了
for(int i = 0; i < n; i++){
if(v[i] == 0){
return 0;
}
}
return 1;
}
void ff(){//检测碰头并掉头
int b[10000] = {0}; // 记录已经碰头并掉头的,避免重复掉头
for(int i = 0; i < n - 1; i++){
if(!b[i]){
for(int j = i + 1; j < n; j++){
if(!b[j]){
if(abs(a[i]) == abs(a[j]) + 1 || abs(a[i]) == abs(a[j]) - 1){//
if(vis[i] || vis[j]){
vis[i] = 1;
vis[j] = 1;
}
a[i] = -a[i];
a[j] = -a[j];
b[i] = 1;
b[j] = 1;
break;
}
}
}
}
}
}
int main()
{
ff();
vis[0] = 1;
cin>>n;
for(int i = 0; i < n; i++){
cin>>a[i];
}
while(!f()){
for(int i = 0; i < n; i++){
if(!v[i]){
//a[i]++;
if(a[i] > 0){
a[i]++;
}
if(a[i] < 0){
a[i]--;//这是我一开始没考虑好,认为向左走就是a--,但是我后来发现还是a++,但是改成a++就是0分,不懂了
}
if(a[i] == 0 || abs(a[i]) == 100){
v[i] = 1;
}
}
}
ff();
}
for(int i = 0; i < n; i++){
if(vis[i]){
ans++;
}
}
cout<<ans;
return 0;
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复