第二题:情报传递1
代码1(c++):
#include <iostream>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int a, b, c;
cin >> a >> b >> c;
int steps = 0;
while (a < b) {
if (a % c == 0) {
a++;
continue;
}
if (a + 2 <= b && (a + 2) % c != 0) {
a += 2;
} else {
a++;
}
steps++;
}
cout << steps << endl;
}
return 0;
}
算法包含bfs,可以利用对题目分析,避免筛选的情况进行求解。
代码2(c):
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int t;
scanf("%d",&t);
for(int i = 0; i < t; i++){
int a,b,c;
int day = 0;
scanf("%d %d %d",&a,&b,&c);
while(a != b){
if( (a+2) % c != 0 && (a+2) <= b){
a = a + 2;
day++;
}
else{
a = a + 1;
day++;
}
}
printf("%d",day);
}
}
第三题:村长分钱
关键语句:其一,”只要满足 n 除以 x 后的余数为 k“,可以利用数学公式n/x=zi.....k,k即为该除法的余数;其二,包含两个整数 n的范围较大,为10的九次方,使用long long定义。
代码1
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n,k,x=0,h=0,c=0;
cin>>n>>k;
n=n-k;
for(ll i=1;i<=sqrt(n);i++){
if(n%i==0){
if(i>k){
x++;
}
if(i!=n/i&&n/i>k){
x++;
}
}
}
cout<<x;
return 0;
}
条件解释
-
if(i > k)
:- 这个条件检查当前因子
i
是否大于k
。 - 如果
i
是n
的一个因子,并且i
大于k
,则计数器x
增加 1。 - 意思是:我们只关心大于
k
的因子。
- 这个条件检查当前因子
-
if(i != n / i && n / i > k)
:- 这个条件检查
n / i
(即n
的另一个因子,和i
配对)是否与i
不相等,并且n / i
是否大于k
。 i != n / i
确保我们不重复计算相同的因子(例如,当n
是完全平方数时)。- 如果
n / i
是n
的因子,并且大于k
,则计数器x
也增加 1
- 这个条件检查
优点:避免超时,可以节省了运算的次数,利于快速得到答案。
第四题:情报传递2
代码:(来自@Leavery)
#include <iostream>
using namespace std;
int main() {
int t;
cin>>t;
while (t--) {
int a,b,c;
cin>>a>>b>>c;
if (a/c == b/c) {
cout<<(b-a+1)/2<<'\n';
} else if (c%2 == 0) {
if (a%2 == 1) {
cout<<(b-a+1)/2<<'\n';
} else {
cout<<(b-a)/2+1<<'\n';
}
} else {
int t1 = a/c*c+c;
int t2 = b/c*c;
int a1 = (t1-1-a+1)/2+1;
int a3 = (b-t2-1+1)/2;
int a2 = (c+1)/2 * (b/c-a/c-1);
cout<<a1+a2+a3<<'\n';
}
}
return 0;
}
第五题:好汉身份
代码:(来自@照猫画虎)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5;
bool c(pair<int ,int > a,pair<int, int> b)
{
return a.first+a.second <= b.first + b.second;//按和从小到大比价,若小,返回true,数组内的a,b,不移动
}
int main()
{
long long n, sum = 0;//必须为longlong ,不然会爆
cin >> n;
pair <int, int> a[N];
for (int i = 0; i < 2 * n; i++)
cin >> a[i].first;//将原价存入pair的第一个数中
for (int i = 0; i < 2 * n; i++)
cin >> a[i].second;//将特价存入pair的第二个数中
sort(a,a + 2 * n,c);//将0到2*n-1个数排序,排序标准按c函数执行
for (int i = 0; i < 2 * n; i++)
{
//两人从小到大按顺序贪心拿取
if(i % 2==0) sum += a[i].first;
else sum -= a[i].second;
}
cout << sum;
return 0;
}
第六题:武功秘籍
代码:(来自@做不了一点)
#include <iostream>
using namespace std;
using ll=long long;
int main()
{
ll n,k;
cin>>n>>k;
ll num=n%10+1,ans=(k-1)%(n%10+1);
ll a=10;
n/=10;
while(k>num){
ans=((k-1)/num)%(n%10+1)*a+ans;
num+=(n%10)*num;
n/=10;
a*=10;
}
cout<<ans;
return 0;
}
标签:10,专场,int,18,ll,cin,蓝桥,++,include
From: https://blog.csdn.net/2301_80098422/article/details/142032784