资讯动态

C++|【机试】26.3.20

发布时间:2026/8/15 21:52:20 来源:尧图企业网站定制
题目121分糖果作者: xxx时间限制: 10s章节: 一维数组问题描述肖恩和帕特里克是兄弟他们从他们的父母那里得到了很多糖果。每一块糖具有一个正整数的价值孩子们希望分他们得到的糖果。首先肖恩将这些糖果分成两堆并选择一堆给帕特里克。然后帕特里克将尝试计算每堆的价值其中每堆的价值是那堆糖果价值的总和如果他觉得没有平等的价值他将开始哭了起来。不幸的是帕特里克太小了所以不能正确的计算。他只会二进制无进位的加法。比如说他想算12二进制为1100加5二进制为101他会把最右边的两位加法算正确但是第三位会忘记进位。即000,011,101,110因此帕特里克算12加5的结果为9。下面几个是帕特里克算的结果5 4 17 9 1450 10 56肖恩数学很好他想得到价值总和更高的糖果并且不让他的弟弟哭。如果可能他会分成两个非空的糖果袋让帕特里克认为双方都有相同的值的糖果。给你每一袋糖果每一块糖果的价值我们想知道是否可能让帕特里克相信他们得到糖果价值的总量是相同的。如果可能计算出肖恩能得到的最大的价值。输入说明第一行输入T(1T10)表示接下来输入T组测试数据。每组测试数据占一行每行包含以下数据N C1 C2 .. Cn(其中N(2 ≤ N ≤ 10)代表从父母那里得到糖果的总数C(1 ≤ Ci ≤ 100)代表每块糖果的价值)输出说明若不能输出NO若能则输出肖恩得到的最大的价值。总结1. 弟弟的计算为异或运算弟弟觉得公平的情况为两堆糖果的异或值相等即这两队糖果的异或值异或结果为0即整堆糖果的异或值为0此时将糖果价值最小的一颗为一堆其他糖果为一堆则肖恩得到的最大的价值2. C语言中异或运算用 ^ 实现对每堆糖果计算正确的总价值及异或值遍历完每颗糖果若这堆糖果异或值不为0则这堆糖果帕特里克不相信他们得到糖果价值的总量相同若异或值为0找到价值最小的给帕特里克用总价值 - 最小的价值即为肖恩得到的最大的价值#include stdio.hint main() {int t;scanf(%d, t);for(int i 0; i t; i){int n;scanf(%d, n);int arr[10];int total_xor 0;int total_sum 0;int min_val 101; //糖果价值最大为100for(int j 0; j n; j){scanf(%d, arr[j]);total_sum arr[j];//正确价值total_xor ^ arr[j];//帕特里克算if(arr[j] min_val){min_val arr[j];}}if(total_xor ! 0)printf(NO\n);elseprintf(%d\n, total_sum - min_val);}return 0;}题目122循环数作者: xxx时间限制: 1s章节: 一维数组问题描述循环数是那些不包括0这个数字的没有重复数字的整数 (比如说, 81362) 并且同时具有一个有趣的性质, 就像这个例子:如果你从最左边的数字( 记为n在这个例子中是8) 开始往右边数一直数n个数字(如果已经到了最右边则回到最左边),你会停在另一个不同的数字上。如果停在一个相同的数字上这个数就不是循环数。就像: 8 1 3 6 2 从最左边接下去数8个数字: 1 3 6 2 8 1 3 6 所以下一个数字是6. 重复这样做 (这次从6开始数6个数字) 并且你会停止在一个新的数字上: 2 8 1 3 6 2, 也就是2. 再这样做 (这次数两个): 8 1。 再一次 (这次数一个): 3。 又一次: 6 2 8 这时你回到了起点。此时我们数到的数字依次是8 6 2 1 3即每一个数字都被数了1次并且回到了起点。如果你将每一个数字都数了1次以后没有回到起点, 你的数字不是一个循环数。给你一个数字 M (在1到9位之间), 找出第一个比 M大的循环数输入的M保证这个循环数能保存在4位的有符号整数中。输入说明仅仅一行, 包括M输出说明仅仅一行包括第一个比M大的循环数。总结1. is_circular() 判断一个数是否为循环数将该数用字符串存储首先判断该数的每个数字是否有0有0不为循环数随后检查该数的每位数是否都不一样若有一样的数则该数不为循环数判断完这两个条件之后开始循环2. visited[] 记录每个位置是否被访问current 记录当前位置visited_count 记录已访问的位数个数对于每次循环首先访问当前起点visited[current] 1visited_count计算当前要走的步数 steps str[current] - 0令 current 指向走完后的位置 current (current steps) % len一个数为循环数的条件为每个位置都被访问且访问的个数为数的长度#include stdio.h#include string.h//是否是循环数int is_circular(int num){char str[20];sprintf(str, %d, num);int len strlen(str);//检查是否包含0for (int i 0; i len; i) {if(str[i] 0)return 0;}//检查是否有重复数字int digits[10] {0};for(int i 0; i len; i){int digit str[i] - 0;if(digits[digit] ! 0)return 0; //有重复digits[digit] 1;}//模拟循环过程int visited[20] {0}; //记录每个位置是否被访问过int current 0; //当前位置int visited_count 0;while(1){if(visited[current]){//如果访问过这个位置if(current 0 visited_count len){//回到起点且所有位置都访问过return 1;}else{//重复访问但条件不满足return 0;}}visited[current] 1;visited_count;//计算要走的步数int steps str[current] - 0;//移动当前位置current (current steps) % len;}return 0;}int main(){int m;scanf(%d, m);int num m 1;while(1){if(is_circular(num)){printf(%d\n, num);break;}num;}return 0;}题目124分数化小数作者: xxx时间限制: 1s章节: 字符串问题描述写一个程序输入一个形如N/D的分数(N是分子D是分母)输出它的小数形式。如果小数有循环节的话把循环节放在一对圆括号中。例如 1/3 .33333333 写成0.(3)41/333 0.123123123... 写成0.(123)用xxx.0 表示整数典型的转化例子 1/3 0.(3)22/5 4.41/7 0.(142857)2/2 1.03/8 0.37545/56 0.803(571428)输入说明单独的一行包括被空格分开的 N和D 1 N,D 100000。输出说明小数的表示方法上面说的很明白了如果输出的长度超过76个字符每行输出76个字符包括小数点、括号等。总结1. 首先计算整数部分若余数为0直接输出若余数不为0开始求小数部分2. remainder_pos[]记录每个余数第一次出现的位置decimal[]: 存储小数位的数组rem_pos[]: 记录每个余数第一次出现的位置初始为-1pos 0: 当前小数位数cycle_start -1: 循环节开始位置3. 循环直到余数为0或检测到循环检查当前余数是否出现过如果出现过表明小数开始循环令 cycle_start remainder_pos[remainder]跳出循环如果没出现过remainder_pos[remainder] pos计算下一位小数 remainder * 10digit remainder / Ddecimal[pos] digitremainder % D4. 构造输出字符串若小数部分无循环输出 integer . decimal[0..pos-1]若小数部分有循环输出 integer . decimal[0..cycle_start-1] ( decimal[cycle_start..pos-1] )每76个字符为一行不足76个字符依旧换行#include stdio.h#include string.h#define MAX_SIZE 100010int main(){int N, D;scanf(%d %d, N, D);char result[MAX_SIZE]; //存储整个结果字符串int pos 0; //结果字符串的当前位置//处理整数部分int integer N / D;pos sprintf(result, %d., integer);N N % D; //取余数if(N 0){result[pos] 0;result[pos] \0;}else{//记录余数出现的位置int remainder_pos[MAX_SIZE];memset(remainder_pos, -1, sizeof(remainder_pos));char decimal[MAX_SIZE]; //存储小数部分int decimal_len 0; //小数部分的长度int cycle_start -1; //循环节开始位置//长除法计算小数部分while (N ! 0){//检查当前余数是否出现过if(remainder_pos[N] ! -1){cycle_start remainder_pos[N];break;}//记录余数位置remainder_pos[N] decimal_len;//计算下一位小数N * 10;int digit N / D;decimal[decimal_len] digit 0;N N % D;}if (cycle_start -1){//有限小数for(int i 0; i decimal_len; i)result[pos] decimal[i];}else{//循环小数//先添加循环节前的部分for(int i 0; i cycle_start; i){result[pos] decimal[i];}//添加左括号result[pos] (;//添加循环节for(int i cycle_start; i decimal_len; i){result[pos] decimal[i];}//添加右括号result[pos] );}result[pos] \0;}//输出结果每76个字符换行int len strlen(result);for(int i 0; i len; i){putchar(result[i]);if((i 1) % 76 0 i ! len - 1){printf(\n);}}//如果最后一行不足76字符也要换行printf(\n);return 0;}翻译In recent years, pre-trained models have played an important role in artificial intelligence research.近些年在人工智能研究方面预训练模型扮演了重要的角色Researchers typically first train a general model using large-scale datasets and then fine-tune it on specific tasks.经典的研究人员首先训练使用大规模的数据集一个通用的模型然后在特殊任务方面对它进行微调In this way, the model can utilize the knowledge learned during the pre-training stage to improve the performance of downstream tasks.通过这种方式模型可以利用在预训练期间学到的知识增强下游任务的表现能力For example, in the field of natural language processing, many language models are pre-trained on massive text corpora例如在自然语言处理领域许多的自然语言基于大量的文本被预训练and achieve excellent results in tasks such as text classification, machine translation, and question answering.并且取得了优秀的成果在任务方面文本分类任务机器翻译任务和问答任务The pre-training and fine-tuning framework not only reduces training costs but also improves the generalization ability of models.预训练和微调框架不仅减少了训练成本并且增加了模型的泛化能力。Therefore, this approach has become an important paradigm in modern artificial intelligence research.因此这种方式在现代人工智能研究领域是非常重要的典例。单词

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价