2014Q1:细菌的战争
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
有两种细菌,一种是有害菌,繁殖能力很强,每小时会繁殖一倍;另一种是有益菌,繁殖能力较弱,每小时能繁殖百分之五。但在单位体积内,当有害菌数量超过一 百万时,多出的细菌会因为密度太大而迅速死亡,直到细菌数量下降到一百万。已知每个有益菌每小时能消灭一个有害菌。给定单位体积内有害菌和有益菌的初始数 量,请问多少小时后,有害菌将被有益菌消灭干净?
输入
-
输入的第一行为一个整数n,表示后边有n组数据。
每组数据占一行,有两个整数,依次为有害菌和有益菌单位体积中的初始数量。整数之间用一个空格分隔。
输出
- 输出有n行,每行一个整数,为每组数据对应的有害菌将被有益菌消灭干净所用的小时数。 样例输入
-
4 364 78 289 48 952 40 966 23
样例输出
-
187 199 203 220
提示
-
1. 被消灭的有害菌不能繁殖;
2. 有害菌的总数最大为一百万。
using namespace std;
int n;
int main()
{
cin >> n;
for(int i = 1;i <= n;i++)
{
int a,b;
int hour = 0;
scanf("%d %d",&a,&b);
while(a > 0)
{
a -= b;
a <<= 1;
b *= 1.05;
hour++;
if(a > 1000000)
a = 1000000;
}
printf("%d\n",hour);
}
return 0;
}
2014Q2:分数求和
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
输入n个分数并对他们求和,并用最简形式表示。所谓最简形式是指:分子分母的最大公约数为1;若最终结果的分母为1,则直接用整数表示。
如:5/6、10/3均是最简形式,而3/6需要化简为1/2, 3/1需要化简为3。
分子和分母均不为0,也不为负数。
输入
-
第一行是一个整数n,表示分数个数,1 <= n <= 10;
接下来n行,每行一个分数,用"p/q"的形式表示,不含空格,p,q均不超过10。
输出
- 输出只有一行,即最终结果的最简形式。若为分数,用"p/q"的形式表示。 样例输入
-
2 1/2 1/3
样例输出
-
5/6
- 模拟模拟
- 代码:
- #include<bits/stdc++.h>
using namespace std;
int n;
long long son,mom,sumson,summom;
long long gcd(long long a,long long b)
{
}
int main()
{
cin >> n;
for(int i = 1;i <= n; i++)
{
char ch;
if(i == 1)
{
scanf("%lld %c %lld",&sumson,&ch,&summom);
continue;
}
scanf("%lld %c %lld",&son,&ch,&mom);
sumson = sumson * mom + son * summom;
summom = summom * mom;
}
long long g = gcd(sumson,summom);
if(g == 1)
{
if(summom == 1)
printf("%lld",sumson);
else{
printf("%lld/%lld",sumson,summom);
}
}
else{
sumson /= g;
summom /= g;
if(summom == 1)
printf("%lld",sumson);
else{
printf("%lld/%lld",sumson,summom);
}
}
return 0;
}
2015Q1:流感传染
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
有一批易感人群住在网格状的宿舍区内,宿舍区为n*n的矩阵,每个格点为一个房间,房间里可能住人,也可能空着。在第一天,有些房间里的人得了流感,以后每天,得流感的人会使其邻居传染上流感,(已经得病的不变),空房间不会传染。请输出第m天得流感的人数。
输入
-
第一行一个数字n,n不超过100,表示有n*n的宿舍房间。
接下来的n行,每行n个字符,’.’表示第一天该房间住着健康的人,’#’表示该房间空着,’@’表示第一天该房间住着得流感的人。
接下来的一行是一个整数m,m不超过100.
输出
- 输出第m天,得流感的人数 样例输入
-
5 ....# .#.@. .#@.. #.... ..... 4
样例输出
-
16
- 查看
- 提交
- 统计
- 提问
-
- #include<bits/stdc++.h>
using namespace std;
const int MAXN = 105;
int ans = 0;
int k = 0;
char Map[MAXN][MAXN];
int n,m;
int flag[MAXN][MAXN];
int ganran[MAXN * MAXN];
void search(int t)
{
{
k++;
for(int i = 0;i < n;i++)
{
for(int j = 0;j < n;j++)
{
if(Map[i][j] == '@' && flag[i][j] == k - 1)
{
ans++;
if(t == 0) goto on;
if(i + 1 < n && Map[i + 1][j] == '.' && !flag[i + 1][j])
{
Map[i + 1][j] = '@';
flag[i + 1][j] = k;
}
if(i - 1 >= 0 && Map[i - 1][j] == '.' && !flag[i - 1][j])
{
Map[i - 1][j] = '@';
flag[i - 1][j] = k;
}
if(j + 1 < n && Map[i][j + 1] == '.' && !flag[i][j + 1])
{
Map[i][j + 1] = '@';
flag[i][j + 1] = k;
}
if(j - 1 >= 0 && Map[i][j - 1] == '.' && !flag[i][j - 1])
{
Map[i][j - 1] = '@';
flag[i][j - 1] = k;
}
}
on : ;
}
}
}
return;
}
int main()
{
cin >> n;
for(int i = 0;i < n;i++)
{
scanf("%s",Map[i]);
}
cin >> m;
search(m);
printf("%d",ans);
return 0;
} - #include<bits/stdc++.h>
2015Q3:实数加法
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
求2个实数相加的和。
输入输出中出现的实数都有如下的形式: P1P2...Pi.Q1Q2...Qj。对于整数部分,P1P2...Pi是一个非负整数;对于小数部分,至少有一位且最后一位Qj不等于0。
输入
- 2行,分别是两个加数。每个加数不超过100个字符。 输出
- 一行输出是相应的和。数据保证一定是一个小数部分不为0的实数。 样例输入
-
0.111111111111111111111111111111 0.111111111111111111111111111111
样例输出
-
0.222222222222222222222222222222
- 查看
- 提交
- 统计
- 提问
-
- #include<bits/stdc++.h>
const int MAXN = 1005;
using namespace std;
char x;
string s1 = "",s2,s3 = "",s4;
int a[MAXN],b[MAXN],c[MAXN],len;
main(){
while(cin >> x, x != '.')
{
s1 = x + s1;
}
cin >> s2;
while(cin >> x, x != '.')
{
s3 = x + s3;
}
cin >> s4;
if(s1.size() < s3.size()) swap(s1,s3);
for(i = 0;i < s3.size();i++)
{
a[i] += s1[i] + s3[i] - 2*'0';
if(a[i] >= 10)
{
a[i + 1] += a[i]/10;
a[i] %= 10;
}
}
for(;i < s1.size();i++)
{
a[i] += s1[i] - '0';
if(a[i] >= 10)
{
a[i + 1] += a[i]/10;
a[i] %= 10;
}
}
if(a[i]) len = i;
else len = i - 1;
if(s2.size() < s4.size()) swap(s2,s4);
for(i = 0; i < s4.size();i++)
b[i] = s2[i] + s4[i] - 2*'0';
for(;i < s2.size();i++)
b[i] = s2[i] - '0';
for(i = s2.size() - 1;i >= 0;i--)
{
if(i == 0 && b[i] >= 10)
{
a[0]++;
b[0] -= 10;
}
else
if(b[i] >= 10)
{
b[i - 1]++;
b[i] -= 10;
}
}
i = 0;
while(a[i] >= 10)
{
a[i + 1]++;
a[i] -= 10;
i++;
}
len = max(len,i);
for(j = len;j >= 0;j--) printf("%d",a[j]);
cout << '.';
for(j = s2.size() - 1;j >= 0;j--)
if(b[j]) break;
for(i = 0;i <= j;i++)
printf("%d",b[i]);
return 0;
} - #include<bits/stdc++.h>
2015Q4:还是采药问题
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
辰辰是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一个难题。医师把他带到一个到处都是草药的山洞里对他说:“孩子,这个山洞里有一些不同的草药,采每一株都需要一些时间,每一株也有它自身的价值。我会给你一段时间,在这段时间里,你可以采到一些草药。如果你是一个聪明的孩子,你应该可以让采到的草药的总价值最大。” 如果你是辰辰,你能完成这个任务吗?
输入
- 输入第一行有两个整数T(1 <= T <= 1000)和M(1 <= M <= 100),用一个空格隔开,T代表总共能够用来采药的时间,M代表山洞里的草药的数目。接下来的M行每行包括两个在1到100之间(包括1和100)的整数,分别表示采摘某株草药的时间和这株草药的价值。 输出
- 输出包括一行,这一行只包含一个整数,表示在规定的时间内,可以采到的草药的最大总价值。 样例输入
-
70 3 71 100 69 1 1 2
样例输出
-
3
来源
- 计算概论化学学院期末考试
- 查看
- 提交
- 统计
- 提问
-
- #include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
int t,m;
int f[10000][10000];
int w[10000],c[10000];
int main()
{
for(int i = 1;i <= m; i++)
{
cin>>w[i]>>c[i];
}
for(int i = 1; i <= m; i++)
{
for(int j = 0; j <= t ;j++)
{
f[i][j] = (i == 1 ? 0 : f[i-1][j]);
if(j >= w[i]) f[i][j] = max(f[i][j],f[i-1][j-w[i]]+c[i]);
}
}
cout << f[m][t];
return 0;
} - #include<cstdio>
-
2015Q2:字符串最大跨距
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
有三个字符串S,S1,S2,其中,S长度不超过300,S1和S2的长度不超过10。想检测S1和S2是否同时在S中出现,且S1位于S2的左边,并在S中互不交叉(即,S1的右边界点在S2的左边界点的左侧)。计算满足上述条件的最大跨距(即,最大间隔距离:最右边的S2的起始点与最左边的S1的终止点之间的字符数目)。如果没有满足条件的S1,S2存在,则输出-1。
例如,S = "abcd123ab888efghij45ef67kl", S1="ab", S2="ef",其中,S1在S中出现了2次,S2也在S中出现了2次,最大跨距为:18。
输入
- 三个串:S1, S2, S3,其间以逗号间隔(注意,S1, S2, S3中均不含逗号和空格); 输出
- S1和S2在S最大跨距;若在S中没有满足条件的S1和S2,则输出-1。 样例输入
-
abcd123ab888efghij45ef67kl,ab,ef
样例输出
-
18
- 查看
- 提交
- 统计
- 提问
-
- #include<bits/stdc++.h>
using namespace std;
char s1[15],s2[15],s3[305];
int lens1 = 0,lens2 = 0,lens3 = 0;
int k = 0;
int l,r;
int main()
{
while((c = getchar()) && c != ',') s3[lens3++] = c;
while((c = getchar()) && c != ',') s1[lens1++] = c;
while((c = getchar()) && c != EOF) s2[lens2++] = c;
for(int i = 0;i < lens3;i++)
{
if(s3[i] == s1[k]) k++;
else k = 0;
if(k == lens1)
{
l = i + 1;
break;
}
}
int ss2 = lens2 - 2;
for(int i = lens3 - 1;i >= 0;i--)
{
if(s3[i] == s2[ss2]) ss2--;
else ss2 = lens2 - 2;
if(ss2 == 0)
{
r = i - 1;
break;
}
}
int ans = r - l;
if(ans >= 0)
printf("%d",ans);
else
cout << -1;
return 0;
} - #include<bits/stdc++.h>