问题 K: 运动会<__int128>

时间限制: 1 Sec  内存限制: 128 MB

题目描述

在一次运会上,有一个比赛项目,共有N个人参加比赛,要将这N个人分组,每组人数不少于K个,问有多少种分组方式?
比如有16个运动员,每组人数不少于5个,共有6种分组方式:
(1) 分一组,为16人;
(2) 分二组,分别为11人、5人;
(3) 分二组,分别为10人、6人;
(4) 分二组,分别为9人、7人;
(5) 分二组,分别为8人、8人;
(6) 分三组,分别为6人、5人、5人。
注意:6+5+5,5+6+5,5+5+6为同一种,只算一种分组方式;

输入

输入共一行为两个整数N, K。表示有N个运动员分组,每组不少于K个人(1 ≤ K ≤ N ≤ 500)。

输出

输出共一行为一个整数,表示分组数。

样例输入 Copy

16 5

样例输出 Copy

6

int128大数

unsigned int :    0~4e9
int:                    -2e9~2e9
unsigned long:  0~4294967295

long: -2147483648~2147483647
__int64 / long long的最大值:-9e18~9e18

unsigned __int64 / unsigned long long的最大值:0~18e18

#include <bits/stdc++.h>
using namespace std;
typedef __int128 ll;
ll dp[505][505];
ll int128read()
{
    ll x=0;
    int flag=1;
    string a;
    cin>>a;
    for(char c:a)
    {
        if(c=='-')
            flag=-1;
        else x=x*10+c-'0';
    }
    return flag*x;
}
void int128print(__int128 x)
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x>9)
        int128print(x/10);
    putchar(x%10+'0');
}
ll dfs(int n,int k)
{
   if(n<k)   return 0;
   if(n<2*k) return 1;
   if(dp[n][k]!=0) return dp[n][k];
   for(int i=k;i<=n;i++)
      dp[n][k]+=dfs(n-i,i);///递增,避免重复
   dp[n][k]++;///自己算一个
   return dp[n][k];
}
int main()
{
   ll n,k;
   scanf("%lld%lld",&n,&k);
   ll ans=dfs(n,k);
   int128print(ans);
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的运动会成绩管理系统的C++代码,实现了基本要求中的功能: ```c++ #include <iostream> #include <fstream> #include <string> #include <vector> #include <algorithm> using namespace std; // 定义学校结构体 struct School { int id; // 学校编号 string name; // 学校名称 int score; // 学校总分 int male_score; // 男子团体总分 int female_score; // 女子团体总分 vector<int> male_scores; // 男子项目成绩 vector<int> female_scores; // 女子项目成绩 }; // 定义项目结构体 struct Project { int id; // 项目编号 string name; // 项目名称 int type; // 项目类型,1为男子项目,2为女子项目 int score[5]; // 前五名积分 int score3[3]; // 前三名积分 vector<int> schools[5]; // 前五名学校编号 vector<int> schools3[3]; // 前三名学校编号 }; // 定义全局变量 vector<School> schools; // 学校列表 vector<Project> projects; // 项目列表 // 比较函数,用于排序 bool cmp_school_id(const School& a, const School& b) { return a.id < b.id; } bool cmp_school_name(const School& a, const School& b) { return a.name < b.name; } bool cmp_school_score(const School& a, const School& b) { return a.score > b.score; } bool cmp_school_male_score(const School& a, const School& b) { return a.male_score > b.male_score; } bool cmp_school_female_score(const School& a, const School& b) { return a.female_score > b.female_score; } bool cmp_project_id(const Project& a, const Project& b) { return a.id < b.id; } bool cmp_project_name(const Project& a, const Project& b) { return a.name < b.name; } // 读取数据 void read_data() { ifstream fin("data.txt"); int n, m, w; fin >> n >> m >> w; // 读取学校信息 for (int i = 0; i < n; i++) { School school; school.id = i + 1; fin >> school.name; schools.push_back(school); } // 读取男子项目信息 for (int i = 0; i < m; i++) { Project project; project.id = i + 1; project.type = 1; fin >> project.name; for (int j = 0; j < 5; j++) { fin >> project.score[j]; } for (int j = 0; j < 3; j++) { fin >> project.score3[j]; } projects.push_back(project); } // 读取女子项目信息 for (int i = 0; i < w; i++) { Project project; project.id = i + m + 1; project.type = 2; fin >> project.name; for (int j = 0; j < 5; j++) { fin >> project.score[j]; } for (int j = 0; j < 3; j++) { fin >> project.score3[j]; } projects.push_back(project); } fin.close(); } // 保存数据 void save_data() { ofstream fout("data.txt"); fout << schools.size() << " " << projects.size() / 2 << " " << projects.size() / 2 << endl; // 保存学校信息 for (int i = 0; i < schools.size(); i++) { fout << schools[i].name << endl; } // 保存男子项目信息 for (int i = 0; i < projects.size() / 2; i++) { fout << projects[i].name << " "; for (int j = 0; j < 5; j++) { fout << projects[i].score[j] << " "; } for (int j = 0; j < 3; j++) { fout << projects[i].score3[j] << " "; } fout << endl; } // 保存女子项目信息 for (int i = projects.size() / 2; i < projects.size(); i++) { fout << projects[i].name << " "; for (int j = 0; j < 5; j++) { fout << projects[i].score[j] << " "; } for (int j = 0; j < 3; j++) { fout << projects[i].score3[j] << " "; } fout << endl; } fout.close(); } // 统计学校总分 void calc_score() { for (int i = 0; i < schools.size(); i++) { int score = 0; int male_score = 0; int female_score = 0; for (int j = 0; j < projects.size(); j++) { if (projects[j].type == 1) { // 男子项目 for (int k = 0; k < projects[j].schools[0].size(); k++) { if (projects[j].schools[0][k] == schools[i].id) { // 学校获得第一名 score += projects[j].score[0]; male_score += projects[j].score[0]; } } for (int k = 0; k < projects[j].schools[1].size(); k++) { if (projects[j].schools[1][k] == schools[i].id) { // 学校获得第二名 score += projects[j].score[1]; male_score += projects[j].score[1]; } } for (int k = 0; k < projects[j].schools[2].size(); k++) { if (projects[j].schools[2][k] == schools[i].id) { // 学校获得第三名 score += projects[j].score[2]; male_score += projects[j].score[2]; } } for (int k = 3; k < 5; k++) { for (int l = 0; l < projects[j].schools[k].size(); l++) { if (projects[j].schools[k][l] == schools[i].id) { // 学校获得第四名或第五名 score += projects[j].score[k]; male_score += projects[j].score[k]; } } } } else { // 女子项目 for (int k = 0; k < projects[j].schools[0].size(); k++) { if (projects[j].schools[0][k] == schools[i].id) { // 学校获得第一名 score += projects[j].score[0]; female_score += projects[j].score[0]; } } for (int k = 0; k < projects[j].schools[1].size(); k++) { if (projects[j].schools[1][k] == schools[i].id) { // 学校获得第二名 score += projects[j].score[1]; female_score += projects[j].score[1]; } } for (int k = 0; k < projects[j].schools[2].size(); k++) { if (projects[j].schools[2][k] == schools[i].id) { // 学校获得第三名 score += projects[j].score[2]; female_score += projects[j].score[2]; } } for (int k = 3; k < 5; k++) { for (int l = 0; l < projects[j].schools[k].size(); l++) { if (projects[j].schools[k][l] == schools[i].id) { // 学校获得第四名或第五名 score += projects[j].score[k]; female_score += projects[j].score[k]; } } } } } schools[i].score = score; schools[i].male_score = male_score; schools[i].female_score = female_score; } } // 统计项目成绩 void calc_project_score() { for (int i = 0; i < projects.size(); i++) { for (int j = 0; j < schools.size(); j++) { if (projects[i].type == 1) { // 男子项目 for (int k = 0; k < schools[j].male_scores.size(); k++) { if (schools[j].male_scores[k] == i) { // 学校获得前五名 if (k == 0) { projects[i].schools[0].push_back(schools[j].id); } else if (k == 1) { projects[i].schools[1].push_back(schools[j].id); } else if (k == 2) { projects[i].schools[2].push_back(schools[j].id); } else if (k == 3) { projects[i].schools[3].push_back(schools[j].id); } else if (k == 4) { projects[i].schools[4].push_back(schools[j].id); } } } } else { // 女子项目 for (int k = 0; k < schools[j].female_scores.size(); k++) { if (schools[j].female_scores[k] == i) { // 学校获得前五名 if (k == 0) { projects[i].schools[0].push_back(schools[j].id); } else if (k == 1) { projects[i].schools[1].push_back(schools[j].id); } else if (k == 2) { projects[i].schools[2].push_back(schools[j].id); } else if (k == 3) { projects[i].schools[3].push_back(schools[j].id); } else if (k == 4) { projects[i].schools[4].push_back(schools[j].id); } } } } } } } // 按学校编号查询学校某个项目的情况 void query_school_project() { int school_id, project_id; cout << "请输入学校编号和项目编号(以空格分隔):"; cin >> school_id >> project_id; for (int i = 0; i < schools.size(); i++) { if (schools[i].id == school_id) { cout << "学校名称:" << schools[i].name << endl; cout << "项目名称:" << projects[project_id - 1].name << endl; if (projects[project_id - 1].type == 1) { // 男子项目 for (int j = 0; j < schools[i].male_scores.size(); j++) { if (schools[i].male_scores[j] == project_id - 1) { cout << "成绩:" << j + 1 << endl; return; } } } else { // 女子项目 for (int j = 0; j < schools[i].female_scores.size(); j++) { if (schools[i].female_scores[j] == project_id - 1) { cout << "成绩:" << j + 1 << endl; return; } } } cout << "该学校未获得前五名" << endl; return; } } cout
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值