第一题
题目描述
众所周知codeforce有4个等级
For Division 1: 1900≤rating
For Division 2: 1600≤rating≤1899
For Division 3: 1400≤rating≤1599
For Division 4: rating≤1399
你会得到一个rating x,输出他对应的等级
输入
第一行输入一个t(1 <= t <= 2000)
第二行输入一个x(-2^63 < x < 2^63)
输出
对于每个测试案例输出一个等级 "Division X",(引号不用输出, x是4和等级)
样例输入 复制
7
-789
1299
1300
1399
1400
1679
2300
样例输出 复制
Division 4
Division 4
Division 4
Division 4
Division 3
Division 2
Division 1
第二题
我们定义一个递归函数w(a,b,c)
如果a,b,c其中任何一个小于等于0就返回1
否则,如果a,b,c其中任何一个大于20就返回w(20,20,20)
否则,如果a<b并且b<c就返回w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c)
否则,返回w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,,b-1,c-1)
输入
多组输入 (不超过1e5组)
对于每一组输入给定三个数a,b,c(保证a,b,c都在[-1e9,1e9]的范围内)
输出
输出递归函数w(a,b,c)计算后的值
样例输入 复制
1 1 1
2 2 2
样例输出 复制
2
4
提示
假设a,b,c都是15的时候,递归调用情况下会出现很多重复计算,所以单纯的递归会时间超限
将下面的c++代码用python写出来
#include <iostream>
#include <cstdio>
using namespace std;
int arr[1000];
int n;
int sum;
void dfs(int step, int k)
{
if(step == k+1) //退出条件, 第step个盒子变成k+1个
{
int num = 0;
for(int i = 1; i <= n; i++)
num += arr[i];
if(num == n)
{
printf("%d=%d",n,arr[1]);
for(int i = 2; i <= k; i++)
printf("+%d",arr[i]);
cout << endl;
sum++;
}
return;
}
for(int i = 1; i <= n; i++)
{
arr[step] = i;//数字可以重复使用,没有必要去标记
if(arr[step] >= arr[step - 1])
{//因为1 2 3和3 2 1是一样的,所以要制定一个规则让后一个数大于等于前一个数
dfs(step + 1, k);
}
}
}
int main()
{
cin>>n;
for(int i = 1; i <= n; i++)
dfs(1,i);
cout << sum;
return 0;
}