现有n种砝码,重量互不相等,分别为 m1,m2,m3…mn ;
每种砝码对应的数量为 x1,x2,x3...xn 。现在要用这些砝码去称物体的重量(放在同一侧),问能称出多少种不同的重量。
注:
称重重量包括 0
数据范围:每组输入数据满足 1≤n≤10 , 1≤mi≤2000 , 1≤xi≤10
对于每组测试数据:
第一行:n --- 砝码的种数(范围[1,10])
第二行:m1 m2 m3 ... mn --- 每种砝码的重量(范围[1,2000])
第三行:x1 x2 x3 .... xn --- 每种砝码对应的数量(范围[1,10])
利用给定的砝码可以称出的不同的重量数
#include
#include
#include
#include
using namespace std;int main(){int n;while(cin >> n){vector
#include
#include
#include
using namespace std;int main(){int n;while(cin >> n){vector
HJ42 学英语
Jessi初学英语,为了快速读出一串数字,编写程序将数字转换成英文:
具体规则如下:
1.在英语读法中三位数字看成一整体,后面再加一个计数单位。从最右边往左数,三位一单位,例如12,345 等
2.每三位数后记得带上计数单位 分别是thousand, million, billion.
3.公式:百万以下千以上的数 X thousand X, 10亿以下百万以上的数:X million X thousand X, 10 亿以上的数:X billion X million X thousand X. 每个X分别代表三位数或两位数或一位数。
4.在英式英语中百位数和十位数之间要加and,美式英语中则会省略,我们这个题目采用加上and,百分位为零的话,这道题目我们省略and
下面再看几个数字例句:
22: twenty two
100: one hundred
145: one hundred and forty five
1,234: one thousand two hundred and thirty four
8,088: eight thousand (and) eighty eight (注:这个and可加可不加,这个题目我们选择不加)
486,669: four hundred and eighty six thousand six hundred and sixty nine
1,652,510: one million six hundred and fifty two thousand five hundred and ten
说明:
数字为正整数,不考虑小数,转化结果为英文小写;
保证输入的数据合法
关键字提示:and,billion,million,thousand,hundred。
数据范围:1≤n≤2000000
输入一个long型整数
输出相应的英文写法
#include
#include
const string tens[] = { "ten","eleven","twelve","thirteen","fourteen","fifteen","sixteen","seventeen","eighteen","nineteen" };
const string twenties[] = { "zero","ten","twenty","thirty","forty","fifty","sixty","seventy","eighty","ninety" };
const int ihundreds[] = { (int)1e2, (int)1e3, (int)1e6, (int)1e9, (int)1e12 };
const string hundreds[] &#61; { "hundred", "thousand", "million", "billion" };string itoe(long long n){if (0<&#61;n && n<&#61;9){//个位数&#xff0c;直接输出return ones[n];}if (10<&#61;n && n<20){//十位数&#xff0c;直接输出return tens[n%10];}if (20<&#61;n && n<1e2){//20-100return twenties[n/10] &#43; (n%10 ? " " &#43; ones[n%10] : "");}for (int i&#61;0; i <4; i&#43;&#43;){//大于100if (n
#include
#include
#include
#include
const vector
const vector
const vector
HJ43 迷宫问题
定义一个二维数组 N*M &#xff0c;如 5 × 5 数组下所示&#xff1a;
int maze[5][5] &#61; {
0, 1, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 0, 0,
0, 1, 1, 1, 0,
0, 0, 0, 1, 0,
};
它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只能横着走或竖着走&#xff0c;不能斜着走&#xff0c;要求编程序找出从左上角到右下角的路线。入口点为[0,0],既第一格是可以走的路。
数据范围&#xff1a; 2≤n,m≤10 &#xff0c; 输入的内容只包含 0≤val≤1
输入两个整数&#xff0c;分别表示二维数组的行数&#xff0c;列数。再输入相应的数组&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路。数据保证有唯一解,不考虑有多解的情况&#xff0c;即迷宫只有一条通道。
左上角到右下角的最短路径&#xff0c;格式如样例所示。
#include
#include
using namespace std;vector
void dfs(vector
}
int main(){int n, m;while(cin >> n >> m){vector
#include
#include
#include
using namespace std;int main(){int n, m;int direct[4][2] &#61; {{-1, 0}, {0, -1}, {1, 0}, {0, 1}};while(cin >> n >> m){vector
#include
int a[15][15],vis[15][15];
int b[4][2]&#61;{{-1,0},{0,1},{1,0},{0,-1}};//上下左右四个方向
pair
}
int main(){int n,m;while(cin >> n >> m){for(int i&#61;0;i
}
HJ44 Sudoku
问题描述&#xff1a;数独&#xff08;Sudoku&#xff09;是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字&#xff0c;推算出所有剩余空格的数字&#xff0c;并且满足每一行、每一列、每一个3X3粗线宫内的数字均含1-9&#xff0c;并且不重复。
例如&#xff1a;
输入
输出
数据范围&#xff1a;输入一个 9*9 的矩阵
包含已知数字的9X9盘面数组[空缺位以数字0表示]
完整的9X9盘面数组
#include
bool flag &#61; false;//flag为true时表示推算完成&#xff0c;结束递归bool check(int n){//判断当前位置的值是否满足条件int h &#61; n / 9;//行号int l &#61; n % 9;//列号for (int i &#61; 0; i <9; &#43;&#43;i){//同一列中不能有重复if (i !&#61; h && num[i][l] &#61;&#61; num[h][l]){return false;}}for (int j &#61; 0; j <9; &#43;&#43;j){//同一行中不能有重复if (j !&#61; l && num[h][j] &#61;&#61; num[h][l]){return false;}}for (int i &#61; h / 3 * 3; i
{if (n &#61;&#61; 81){//如果已经递归到右下角&#xff0c;输出整个盘面&#xff0c;并置flag为true&#xff0c;结束递归for (int i &#61; 0; i <9; &#43;&#43;i){for (int j &#61; 0; j <8; &#43;&#43;j){cout <
{for (int i &#61; 0; i <9; &#43;&#43;i){for (int j &#61; 0; j <9; &#43;&#43;j){cin >> num[i][j];//输入9x9盘面}}dfs(0);//从左上角开始递归return 0;
}
#include
int row[9][9]&#61;{0};
int col[9][9]&#61;{0};
int block[3][3][9]&#61;{0};
bool flag &#61; false;//flag为true时表示推算完成&#xff0c;结束递归bool check(int n,int num){//判断当前位置的值是否满足条件int h &#61; n / 9;//行号int l &#61; n % 9;//列号if(row[h][num-1] &#61;&#61; 1||col[l][num-1] &#61;&#61; 1|| block[h/3][l/3][num-1]&#61;&#61;1){return false;}return true;
}void dfs(int n){if (n &#61;&#61; 81){//如果已经递归到右下角&#xff0c;输出整个盘面&#xff0c;并置flag为true&#xff0c;结束递归for (int i &#61; 0; i <9; &#43;&#43;i){for (int j &#61; 0; j <8; &#43;&#43;j){cout <
{for (int i &#61; 0; i <9; &#43;&#43;i){for (int j &#61; 0; j <9; &#43;&#43;j){int temp;cin >> num[i][j];//输入9x9盘面temp &#61; num[i][j];if(temp!&#61;0){//记录每行、每列、每九宫格值的信息row[i][temp-1] &#61; 1;col[j][temp-1] &#61; 1;block[i/3][j/3][temp-1] &#61; 1;}}}dfs(0);//从左上角开始递归return 0;
}
#include
#include
using namespace std;vector
vector
vector
vector
vector
HJ45 名字的漂亮度
给出一个字符串&#xff0c;该字符串仅由小写字母组成&#xff0c;定义这个字符串的“漂亮度”是其所有字母“漂亮度”的总和。
每个字母都有一个“漂亮度”&#xff0c;范围在1到26之间。没有任何两个不同字母拥有相同的“漂亮度”。字母忽略大小写。
给出多个字符串&#xff0c;计算每个字符串最大可能的“漂亮度”。
本题含有多组数据。
数据范围&#xff1a;输入的名字长度满足 1≤n≤10000
第一行一个整数N&#xff0c;接下来N行每行一个字符串
每个字符串可能的最大漂亮程度
/*
解题思路&#xff1a;笨方法——用「钱」式思维来思考
名字的漂亮度&#xff0c;其实就是比谁的名字更值钱&#xff01;
我们将名字的字母对应的「数字」作为它的价钱&#xff0c;
比如 26 最高&#xff0c;1 则最低&#xff0c;按大小顺序排布。
那么&#xff0c;我们要得到名字的最大可能「漂亮度」&#xff0c;
就要使得&#xff0c;越高频出现的字母&#xff0c;价钱越高。
Better than OK? 来&#xff01;我们一起开始写代码&#xff01;
*/
#include
#include
using namespace std;
//计算名字的最大可能漂亮度&#xff08;最高价钱&#xff09;的函数接口
int MostValuableName (string Name) {int Alphabet[26] &#61; {0}; //初始化一个数组&#xff0c;用于记录名字中不同字母出现的次数int Price[26] &#61; {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26}; //初始化一个价钱表int MostValuable &#61; 0; //初始化名字的最高价钱for (int i &#61; 0; i
}
//计算多个名字的最大可能漂亮度&#xff08;最高价钱&#xff09;的函数接口
int MaximumPriceOfName (int Number) {string Name; //字符串形式的名字for (int i &#61; 0; i
//主函数
int main () {int N; //需要计算最大可能漂亮的名字个数while (cin >> N) {MaximumPriceOfName (N); //输出多个名字的最大可能漂亮度}return 0;
}
HJ46 截取字符串
输入一个字符串和一个整数 k &#xff0c;截取字符串的前k个字符并输出
数据范围&#xff1a;字符串长度满足 1≤n≤1000 &#xff0c; 1≤k≤n
1.输入待截取的字符串
2.输入一个正整数k&#xff0c;代表截取的长度
截取后的字符串
#include
#include
{string str;int k;while(cin>>str>>k){//输入字符串和kstring sub_str &#61; str.substr(0,k);cout<
#include
#include
{string str;int k;while(cin>>str>>k){//输入字符串和kfor(int i &#61; 0;i
HJ48 从单向链表中删除指定值的节点
#include
#include
#include
using namespace std;int main(){int n, head;while(cin >> n >> head){vector
#include
#include
#include
using namespace std;struct node{ //链表结点int val;struct node* next &#61; NULL;
};int main(){int n, val;while(cin >> n >> val){node* head &#61; new node; //头结点head->val &#61; val;for(int i &#61; 1; i
HJ50 四则运算
输入一个表达式&#xff08;用字符串表示&#xff09;&#xff0c;求这个表达式的值。
保证字符串中的有效字符包括[‘0’-‘9’],‘&#43;’,‘-’, ‘*’,‘/’ ,‘(’&#xff0c; ‘)’,‘[’, ‘]’,‘{’ ,‘}’。且表达式一定合法。
数据范围&#xff1a;表达式计算结果和过程中满足 ∣val∣≤1000 &#xff0c;字符串长度满足 1≤n≤1000
输入一个算术表达式
得到计算结果
#include
#include
#include
using namespace std;int compute(string& s, int left, int right){char op &#61; &#39;&#43;&#39;; //默认加开始int num &#61; 0;vector
}
int main(){string s;while(cin >> s){cout <
#include
#include
using namespace std;void compute(stack
}bool priority(char m, char n){ //比较运算符优先级if(m &#61;&#61; &#39;(&#39;) //括号优先级最高return false;else if((m &#61;&#61; &#39;&#43;&#39; || m &#61;&#61; &#39;-&#39;) && (n &#61;&#61; &#39;*&#39; || n &#61;&#61; &#39;/&#39;)) //加减法小于乘除法return false;return true;
}
int main(){string s;while(cin >> s){stack
HJ51 输出单向链表中倒数第k个结点
输入一个单向链表&#xff0c;输出该链表中倒数第k个结点&#xff0c;链表的倒数第1个结点为链表的尾指针。
链表结点定义如下&#xff1a;
struct ListNode
{int m_nKey;ListNode* m_pNext;
};
正常返回倒数第k个结点指针&#xff0c;异常返回空指针.
要求&#xff1a;
(1)正序构建链表;
(2)构建后要忘记链表长度。
数据范围&#xff1a;链表长度满足 1≤n≤1000 &#xff0c;k≤n &#xff0c;链表中数据满足0≤val≤10000
本题有多组样例输入。
输入说明
1 输入链表结点个数
2 输入链表的值
3 输入k的值
输出一个整数
#include
using namespace std;struct ListNode{ //链表结点int val;ListNode* next;ListNode(int x) : val(x), next(NULL){} //初始化
};
ListNode* FindKthToTail(ListNode* pHead, int k, int n) { //找到链表倒数第k个结点ListNode* p &#61; pHead;if(n
}int main(){int n;while(cin >> n){ //输入nint val;cin >> val;ListNode *head &#61; new ListNode(val); //链表第一个结点ListNode *p &#61; head;for(int i &#61; 1; i
#include
using namespace std;struct ListNode{ //链表结点int val;ListNode* next;ListNode(int x) : val(x), next(NULL){} //初始化
};
ListNode* FindKthToTail(ListNode* pHead, int k) {//找到链表倒数第k个结点int n &#61; 0;ListNode* fast &#61; pHead;ListNode* slow &#61; pHead;for(int i &#61; 0; i
}int main(){int n;while(cin >> n){ //输入nint val;cin >> val;ListNode *head &#61; new ListNode(val); //链表第一个结点ListNode *p &#61; head;for(int i &#61; 1; i