1、跑步训练
答案:3880
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
int N = 10000;
int res = 0;
while(N > 0){
if(N >= 600){
N-=600;
res +=60;
}
else{
break;
}
N += 300;
res += 60;
}
if(N == 0){
cout << res << endl;
}else{
cout << res + N / 10 << endl;
}
return 0;
}
2、合并检测
#include <iostream>
using namespace std;
/* 方法一:最小值求导
设总人数pop, k 人一组
pop/k 为分组数,
对于每个组需要的盒子应该是:
1+ k*0.01*(k+1), 因为有k人中有0.01的概率需要独立检测需要(k+1)
总盒子sum = (pop/k) *(1 + k*0.01*(k+1))
sum求最小值,sum求导 = pop(1/100 - 1/(k^2)) = 0
所以k = 10;
*/
int main(int argc, char** argv) {
int min = 100; //k区间是小于100的,因为感染率为1%,如果k > 100 的必定所有人都要单独检测
int posk = 0;
for(int k = 1; k <= 100; k++){
int temp = 0;
if(100 % k == 0){
temp = k + 100/k; // 100/k 表示被感染者所在组都要单独检测
}else{
temp = k + 100/k + 1;
}
if(temp < min){
min = temp;
posk = k;
}
cout << posk << endl;
return 0;
}
4、纪念日
计算器日期年限
5. 解码
#include <iostream>
using namespace std;
int main(int argc, char** argv) {
string s;
getline(cin, s);
string res;
for(int i = 0; i < s.length(); i++){
if((s[i] >= 'a' && s[i] <= 'z' )|| (s[i] >= 'A' && s[i] <= 'Z' )){
res += s[i];
}else if(s[i] >= '1' && s[i] <= '9'){
int cnt = s[i] - '1';
while(cnt > 0){
res += s[i-1];
cnt--;
}
}
}
cout << res << endl;
return 0;
}
6、走方格
方法一 :dfs
#include <iostream>
using namespace std;
int n, m, res = 0;
void dfs(int x, int y){
if(x > n || y > m){
return;
}
if(x %2 == 0 && y % 2 == 0){
return;
}
if(x == n && y == m){
res++;
}
dfs(x+1, y);
dfs(x, y+1);
return ;
}
int main(int argc, char** argv) {
cin >> n >> m;
if(n % 2 == 0 && m % 2 == 0){
res = 0;
return 0;
}
dfs(1, 1);
cout << res << endl;
return 0;
}
方法2:dp
int main(int argc, char** argv) {
cin >> n >> m;
if(n % 2 == 0 && m % 2 == 0){
res = 0;
return 0;
}
//方法1
// dfs(1, 1);
// cout << res << endl;
//方法2
int f[35][35] = {0};
for(int i = 1; i <= n; i++){
for(int j = 1; j <= m; j++){
if(i == 1 && j == 1){
f[i][j] = 1;
}else if(i % 2 == 1 || j % 2 == 1){
f[i][j] = f[i-1][j] + f[i][j-1];
}
}
}
cout << f[n][m];
return 0;
}