SDNU__1206.蚂蚁感冒
2017-12-03 09:30
197 查看
长100厘米的细长直杆子上有n只蚂蚁。它们的头有的朝左,有的朝右。 每只蚂蚁都只能沿着杆子向前爬,速度是1厘米/秒。 当两只蚂蚁碰面时,它们会同时掉头往相反的方向爬行。 这些蚂蚁中,有1只蚂蚁感冒了。并且在和其它蚂蚁碰面时,会把感冒传染给碰到的蚂蚁。 请你计算,当所有蚂蚁都爬离杆子时,有多少只蚂蚁患上了感冒。
Input
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
Output
要求输出1个整数,表示最后感冒蚂蚁的数目。
Sample Input
3
5 -2 8
Sample Output
1
这个题如果真的要按照题目说的思路来的话那真的要考虑很多
其实你可以发现两只蚂蚁掉头可以看作蚂蚁均直行,只要考虑带病蚂蚁属性的变化就好了
如果带病蚂蚁(A)向左走,那么是不是再A左边的蚂蚁只要向右走就会得病,在A右边的蚂蚁向左走的(C),如果A左边有向右走的,他会经过A蚂蚁去感染C
所以这是一种考虑情况,另一种类似
再有一种比较方便点的想法
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,x,f[110] = {0},t,sum = 1,sum1 = 0,sum2 = 0;
int flag1 = 0,flag2 = 0,flag ;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x;
if(i==0)
{
x>0 ? t = x , flag = 1 : t = -x , flag = -1; //找到分界点
}
x > 0 ? f[x] = 1:f[-x] = -1; //判断方向
}
for(int i = 0;i < t;i++)
{
if(f[i] == 1)
{
flag = 1;
sum1++;
}
}
for(int i = t + 1;i < 110;i++)
{
if(f[i] == -1)
{
flag2 = 1;
sum2++;
}
}
if(flag )
{
sum += sum2;
if(sum2)
{
sum += sum1;
}
}
else
{
sum += sum1;
if(sum1)
{
sum += sum2;
}
}
cout<<sum<<endl;
return 0;
}
Input
第一行输入一个整数n (1 < n < 50), 表示蚂蚁的总数。
接着的一行是n个用空格分开的整数 Xi (-100 < Xi < 100), Xi的绝对值,表示蚂蚁离开杆子左边端点的距离。正值表示头朝右,负值表示头朝左,数据中不会出现0值,也不会出现两只蚂蚁占用同一位置。其中,第一个数据代表的蚂蚁感冒了。
Output
要求输出1个整数,表示最后感冒蚂蚁的数目。
Sample Input
3
5 -2 8
Sample Output
1
这个题如果真的要按照题目说的思路来的话那真的要考虑很多
其实你可以发现两只蚂蚁掉头可以看作蚂蚁均直行,只要考虑带病蚂蚁属性的变化就好了
如果带病蚂蚁(A)向左走,那么是不是再A左边的蚂蚁只要向右走就会得病,在A右边的蚂蚁向左走的(C),如果A左边有向右走的,他会经过A蚂蚁去感染C
所以这是一种考虑情况,另一种类似
#include<iostream> #include<algorithm> #include<cmath> #include<cstdio> #include<cstdlib> using namespace std; bool cmp(int c,int d) { if(fabs(c) < fabs(d)) return 1; else return 0; } int main() { int n,flag1 = 0,flag2 = 0; int i,cnt1 = 0,cnt2 = 0; int gm,ret = 1; int om[55],l,r; cin>>n; for(i = 0;i < n;i++) { cin>>om[i]; } gm = om[0]; sort(om,om + n,cmp); // for(i = 0;i < n;i++) // { // cout<<om[i]<<endl; // } if(gm > 0) { for( i = 0;i < n;i++) { if(fabs(om[i]) <= gm && om[i] != gm) { if(om[i] > 0) { cnt2++; } continue; } else { if(om[i] < 0) { cnt1++; flag1 = 1; } } } ret += cnt1; if(cnt1 != 0) { ret += cnt2; } cout<<ret<<endl; return 0; } else if(gm < 0) { for( i = 0;i < n;i++) { if(fabs(om[i]) <= fabs(gm)) { //cout<<"11111111111111111111111"; if(om[i] > 0 ) { cnt1++; } } else { if(om[i] < 0) { cnt2++; } } } //cout<<cnt1<<"\n"<<cnt2<<"\n"; ret += cnt1; if(cnt1 != 0) { ret += cnt2; } cout<<ret<<endl; return 0; } // if(gm > 0) // { // for(i = 1;i < n;i++) // { // if(om[i] < 0 && fabs(om[i] > gm)) // { // cnt++; // flag = 1; // } // } // } return 0; }
再有一种比较方便点的想法
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,x,f[110] = {0},t,sum = 1,sum1 = 0,sum2 = 0;
int flag1 = 0,flag2 = 0,flag ;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x;
if(i==0)
{
x>0 ? t = x , flag = 1 : t = -x , flag = -1; //找到分界点
}
x > 0 ? f[x] = 1:f[-x] = -1; //判断方向
}
for(int i = 0;i < t;i++)
{
if(f[i] == 1)
{
flag = 1;
sum1++;
}
}
for(int i = t + 1;i < 110;i++)
{
if(f[i] == -1)
{
flag2 = 1;
sum2++;
}
}
if(flag )
{
sum += sum2;
if(sum2)
{
sum += sum1;
}
}
else
{
sum += sum1;
if(sum1)
{
sum += sum2;
}
}
cout<<sum<<endl;
return 0;
}
相关文章推荐
- SDNU 1206.蚂蚁感冒 【代码如此简单,思维练习】【7月29】
- SDNU 1206.蚂蚁感冒 【代码如此简单,思维练习】【7月29】
- 2014 蓝桥杯 预赛 c/c++ 本科B组 第八题:蚂蚁感冒(10')(4.9更新)
- 第五届蓝桥杯 蚂蚁感冒
- 【ACM】----SDNU-OJ 1206
- 蓝桥杯 蚂蚁感冒
- YTU 2504: 蚂蚁感冒
- 蓝桥杯-蚂蚁感冒
- NYOJ 990 蚂蚁感冒
- NYOJ-990蚂蚁感冒
- 蚂蚁感冒
- 蓝桥杯 蚂蚁感冒 (思维)
- 草稿 感冒蚂蚁
- 历届试题 蚂蚁感冒
- 蚂蚁感冒
- 第五届蓝桥杯C++B组 蚂蚁感冒
- 第五届_8_蚂蚁感冒
- NYOJ 990 蚂蚁感冒
- 历届试题 蚂蚁感冒
- 蚂蚁感冒