本次训练不算太难,相对来说比较容易,大家可以尝试把它补完
1.6964 最小的2个数
本题共有两种解法,可以直接排序,这个做法是nlogn的,题目没有卡
#include <bits/stdc++.h>
using namespace std;
struct T
{
int id, data;
} a[100005];
int cmp(T a, T b) { return a.data < b.data; }
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i++)
{
cin >> a[i].data;
a[i].id = i;
}
sort(a, a + n, cmp);
cout << a[0].id << " " << a[1].id;
return 0;
}
也可以直接O(n)求得,分别求下最小和次小用来更新即可
#include <bits/stdc++.h>
using namespace std;
int a[100005];
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)cin>>a[i];
//默认最小索引是-1
int min1=-1,min2=-1;
for(int i=0;i<n;i++)
{
//比最小还小
if(min1==-1||a[i]<a[min1])
{
//次小更新为最小
min2=min1;
//最小更新为当前
min1=i;
}
else if(min2==-1||a[i]<a[min2])
{
//更新次小
min2=i;
}
}
cout<<min1<<" "<<min2<<"
";
return 0;
}
2.6744 条形码
按题目条件模拟即可。
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
int sum1=0;
//步骤a
//下标从0开始,倒数第一位即长度-1,序号2即长度-2
for(int i=13-2;i>=0;i-=2)
{
sum1+=s[i]-'0';
}
//步骤b,*3
sum1*=3;
//步骤c
for(int i=13-3;i>=0;i-=2)
{
sum1+=s[i]-'0';
}
//步骤d和e
int ans=(sum1+9)/10*10-sum1;
//进行校验
if(ans==s[12]-'0')
{
cout<<"OK";
}
else
{
cout<<"Error";
}
return 0;
}
3.5125 序列猜猜猜
这个题有歧义,get到出题人意思的话一遍就过,如果得不到正确的题意估计要迷茫很久。
我们可以统计猜对的的以及全部出现的,全部出现的-猜对的就是B了
#include <bits/stdc++.h>
using namespace std;
int main()
{
int c = 1;
int n;
while (cin>>n, n)
{
printf("Case %d:
", c++);
char a[10000], b[10000];
cin>>a;
while (cin>>b,b[0]!='0')
{
int A = 0, B = 0;
//统计A,即位置相同的
for (int i = 0; i < n; i++)
{
if (a[i] == b[i])
A++;
}
//依次统计字符的出现次数,取小
for (int i = '1'; i <= 'z'; i++)
{
int an = 0, bn = 0;
//枚举序列的每个字符
for (int j = 0; j < n; j++)
{
if (a[j] == i)
an++;
if (b[j] == i)
bn++;
}
//取小
B += min(an,bn);
}
printf(" (%d,%d)
", A, B - A);
}
}
return 0;
}
4.6741 动动有奖
3个规则分别考虑,可以列出以下流程
①输入总天数n
②表示天数的变量i初始化为1
③若i≤n,则转④,否则转⑦。
④输入第i天的数据(包括第i天走路步数X;,是否成功领取第i天“奖金”的标
记F;)
⑤根据当前输入的数据Ⅹ,F,统计该天领取的奖金并累加到总奖金 total中。
⑥表示天数的变量i增加1,然后转③。
⑦输出变量 total的值。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
double tot=0;
int c=0;
for(int i=0,x,f;i<n;i++)
{
cin>>x>>f;
if(f==1)
{
c=c+1;
}
else
{
c=0;
continue;
}
double t=0;
if(x>=1000)
{
t=0.3+((x-1000)/2000)*0.1;
if(t>3)t=3;
}
if(c>=4)
{
tot=tot+2*t;
}
else
{
tot=tot+t;
}
}
printf("%.1f",tot);
return 0;
}
5.4799 作业调度方案
这个题和C一样也是语文难题,需要读懂然后模拟他的意思,稍有理解错误就GG了
6.1360 奇数阶魔方(II)
找规律之后进行模拟