湖南省城乡建设勘测院 网站,局域网站建设教程,天猫网站建设的目标是什么意思,传媒网站源码A:
题目大意
骑士每连续 i 天每天会得到 i 个金币#xff0c;#xff08;i 1#xff0c; 2#xff0c; 3 #xff0c; …#xff09;,那么展开看每一天可以得到的金币数#xff1a;1 2 2 3 3 3 4 4 4 5 5 5 5 5 … 可以发现就是1个1 #xff0c;2个2, 3个3…,那么我…A:
题目大意
骑士每连续 i 天每天会得到 i 个金币i 1 2 3 …,那么展开看每一天可以得到的金币数1 2 2 3 3 3 4 4 4 5 5 5 5 5 … 可以发现就是1个1 2个2, 3个3…,那么我们相同的一段分开来看他们的加和正好就是这段里面相同数字的平方而每一段里的数字个数就等于这段里的相同数字那么我们想知道到第k 个数完整加了多少段就可以从1 开始遍历如果 k 7 ,那么前面加了完整的三段分别是1 2 2 3 3 3看成个数就是1 2 3那么我们就能想到用数列加和公式 n * ( n 1) / 2 算出来他的个数那么剩下的不够下一段的个数直接乘下一段应为的数就好了比如这个例子就是 7 - 3 * 3 1/ 2 1这个应该是一个 4 最后答案就是完整的段 加上剩余的段 1 ^ 2 2 ^ 2 3 ^ 2 1 * 4 18。
下面展示一些 详细代码。#includestdio.h
int main()
{int k ;// 有k天scanf(%d,k);//输入kint res 0;//用来记录加到第 i 段时 总个数 kfor(int i 1;i 200;i ){if(i*(i 1) / 2 k){res i;//记录break;//已经找到跳出循环}}int m res - 1;//m 表示第k天之前加了多少个完整的段就是相邻赐予金币数相同的一段天数int cnt k - m *(m 1)/ 2;//记录完整的m段之后剩余的天数最多满足完整的下一段int ans 0;//记录总金币for(int i 1;i m;i )//m段逐个加起来{ans ans (i * i);}ans (m 1) * cnt;//把剩余的加起来因为前面已经加了m个完整的段那么剩余的每一天得到的金币都是m 1,并且剩余的天数即cnt不可能大于m 1.printf(%d , ans);//输出答案return 0;
}B:
//题解暴力从1~n挨个搜索对每次搜索到的数进行while循环以查找x出现的次数多说无益直接看代码。
#includestdio.h
int main() {int n, x;scanf(%d%d, n, x);int count 0;for (int i 1; i n; i)//从1~n挨个搜索{int j i;while (j ! 0){if (j % 10 x) {//判断其最后一位是否为xcount;}j / 10;//去掉最后一位继续向下查找}}printf(%d, count);return 0;
}C
特判由题意得n个位置k个人同时n≥k≥0因此k可以为n也可以为0。考虑这两种情况。在kn||k0这两种情况下牛牛无法坐上过山车因此最少位置和最多位置均为0
正常情况 最多kn,进行模拟当k1010最多有两个位置k2010010最多有四个位置以此类推kt最多有2t个位置。此时让我们想结果成立的条件n≥t*3;但是如果条件不成立呢最多已经是2t了所以此时最多便是除去这k个人之外的所有位置即n-t。
最少除去特判的0最少情况就只有1111__或者__1111的情况了此时最少为1。
#include bits/stdc.h
using namespace std;int main() {long long n, k;cin n k;if (k n || k 0)cout 0 0 \n;else if (n k * 3)cout 1 2 * k \n;elsecout 1 n - k \n;return 0;
}D: E 这道题是一个图论的最短路径问题节点1是中心节点与其相连的边权为A其他边权为B。题目要求找到从节点1出发收集所有7个节点的宝石的最短时间。#include stdio.hint main() {int a, b; scanf(%d %d, a, b); // 输入A和B // 通过分析图的结构最短路径可以直接计算如下// 1. 对于节点1与节点2, 3, 4, 5, 6, 7之间的距离分别为A。// 2. 两个相邻的非中心节点之间的路径为B。// 如果A的值大于等于B则最短时间应该从节点1到达某个外围节点然后沿着外围环路收集其他宝石。// 即最短时间为 a 5 * b // 如果A的值小于B选出这两种情况的最小值即min(a 5 *b, 11* a); if (a 5 * b 11 * a){ printf(%d, 11 * a); return 0; } else { printf(%d, a 5 * b );return 0; }}F:
思路看到题目最终让输出一个数首先要想能不能用二分来做二分要首先确定边界并且判断有无单调性该题就能用二分来做 二分枚举mex的值判断是否符合条件二分判断之后最终将确定下来mex不懂二分的可以看看这篇博客https://blog.csdn.net/2301_80882026/article/details/135197055?ops_request_misc%257B%2522request%255Fid%2522%253A%25225665E938-4BE3-45AB-B426-0C876A134A13%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257Drequest_id5665E938-4BE3-45AB-B426-0C876A134A13biz_id0utm_mediumdistribute.pc_search_result.none-task-blog-2blogfirst_rank_ecpm_v1~rank_v31_ecpm-1-135197055-null-null.nonecaseutm_term%E4%BA%8C%E5%88%86spm1018.2226.3001.4450
#includebits/stdc.husing namespace std;typedef long long ll;
typedef pairint, intPII;
const int N1e610;
const int MOD 1e9 7;
const int INF0X3F3F3F3F;
const int dx[]{-1,1,0,0,-1,-1,1,1};
const int dy[]{0,0,-1,1,-1,1,-1,1};
const int M 1e6 10;int t;
int n;
int a[N];
bool st[N];
bool check(int x)
{memset(st ,0, sizeof st);//初始化for(int i 1; i n; i ){int o a[i];while(o (o x || st[o])) o / 2;st[o] true;//能够到达的数}for(int i 0; i x; i ) //注意mex的定义要判断x符不符合只需要判断小于x的所有数是否均能到达{if(st[i] 0) return false;//说明到达不了x}return true;
}
int main()
{cin t;while(t --){cin n;int res 0;for(int i 1; i n; i )cin a[i], res max(res, a[i]);int l 0, r res 1;while(l r)//二分mex{int mid (l r 1) 1;if(check(mid)) l mid;else r mid - 1;}cout l \n;}return 0;
}G:
//解析
//如果n为偶数那两两交换即可完成 即n/2
//若n为奇数则要多交换一次即多出的那个数与谁交换都可以为(n1)/2次。
#includestdio.h
signed main()
{int n, m;scanf(%d, n);for (int i 1; i n; i)scanf(%d, m);if (n 1) printf(-1);//只有n1时不行else printf(%d, (n 1) / 2);//可简称写为(n1)/2;return 0;
}H:
#includestdio.h
const int N1e510;
bool st[N];
int main()
{int n;scanf(%d,n);int cnt0;for(int i0;i9;i)//先判断从1-10的好数这要在之后的好数判定中有基础if(i%20) st[i]true;for(int i1;in;i)//暴力枚举从1到n的数{int xi,sum0;while(x)//求x的位数之和{int cx%10;sumc;x/10;}//位数之和是偶数不大于它本身是个好数if(sumist[sum]sum%20){cnt;st[i]true;}}printf(%d\n,cnt);
}