大一第七次周赛题解

大一第七次周赛题解

Lionlnuc
Lionlnuc Lv4

A - 2

链接: https://codeforces.com/problemset/problem/1692/A
分析: 输入四个数后比较 a 和 b c d 的大小,如果 a 小了,ans加一,最后输出 ans即可。
代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
void solve()
{
int a,b,c,d;
cin>>a>>b>>c>>d;
int ans=0;
if(b>a)ans++;
if(c>a)ans++;
if(d>a)ans++;
cout<<ans<<endl;
}
signed main(){
IOS
int t;
cin>>t;
// int t=1;
while(t--)
{
solve();
}
}

B - 0

链接: https://codeforces.com/problemset/problem/1692/B
分析: 求至多剩多少个数就使这个数组的元素各不相同,我们每次找到两个元素个数大于一的数,把他删除,这样可以使数组长度尽可能大,最后删除次数是上取整的。可以用桶来计数。
代码实现:

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
27
28
29
30
31
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
const int N=1e4+5;
int a[N];
void solve()
{
int n;
cin>>n;
memset(a,0,sizeof a);
int ans=0;
for(int i=0;i<n;i++)
{
int b;
cin>>b;
if(!a[b])a[b]++;
else ans++;
}
cout<<n-2*ceil(ans*1.0/2)<<endl;
}
signed main(){
IOS
int t;
cin>>t;
// int t=1;
while(t--)
{
solve();
}
}

C - 2

链接: https://codeforces.com/problemset/problem/1692/C
分析: 这个题我们可以看出来,在主教那一行、列都只有主教一个人,所以可以扫描行或列,就能找到答案。
代码实现:

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
27
28
29
30
31
32
33
34
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
char a[9][9];
void solve()
{
for(int i=1;i<=8;i++)
{
for(int j=1;j<=8;j++)
cin>>a[i][j];
}
for(int i=2;i<=7;i++)
{
for(int j=2;j<=7;j++)
{
if(a[i-1][j-1]=='#'&&a[i+1][j-1]=='#'&&a[i-1][j+1]=='#'&&a[i+1][j+1]=='#'&&a[i][j]=='#')
{
cout<<i<<" "<<j<<endl;
break;
}
}
}
}
signed main(){
IOS
int t;
cin>>t;
// int t=1;
while(t--)
{
solve();
}
}

D - 6

链接: https://codeforces.com/problemset/problem/1692/D
分析: 从输入的时间点开始枚举直到这个时间点再次出现。把时间都转换为分钟会好看一些。
代码实现:

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
27
28
29
30
31
32
33
34
35
36
37
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
bool check(int minute)
{
int h=minute/60;
minute=minute%60;
if(h%10==minute/10&&h/10==minute%10) return true;
else return false;

}
void solve()
{
int t1,t2;
char s;
cin>>t1>>s>>t2;
int t,ans=0;
cin>>t;
int minute=t1*60+t2;
do{
if(check(minute))ans++;
minute+=t;
minute%=1440;//防止超过24小时,取余
}while(minute!=t1*60+t2);
cout<<ans<<endl;
}
signed main(){
IOS
int t;
cin>>t;
// int t=1;
while(t--)
{
solve();
}
}

也可以直接标记出回文时间的分钟数,直接进行匹配

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
27
28
29
30
31
32
33
34
35
36
37
38
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
const int p[16] = {0,70,140,210,280,350,601,671,741,811,881,951,1202,1272,1342,1412};
//提前预处理出所有的回文时间。
void solve()
{
int t1,t2;
char s;
cin>>t1>>s>>t2;
int t,ans=0;
cin>>t;
int minute=t1*60+t2;
do{
for(int i=0;i<16;i++)
{
if(minute==p[i])
{
ans++;
break;
}
}
minute+=t;
minute%=1440;//防止超过24小时,取余
}while(minute!=t1*60+t2);
cout<<ans<<endl;
}
signed main(){
IOS
int t;
cin>>t;
// int t=1;
while(t--)
{
solve();
}
}

E - 新

链接: https://codeforces.com/problemset/problem/1692/E
分析:
显然,如果数组本身的和就小于 s,那是肯定无解的。
然后从第一个数开始,用 l, r 代表左右端,然后进行遍历加入操作,直到达到数组长度,取最少的操作次数输出。
代码实现:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <bits/stdc++.h>
using namespace std;
//#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
const int N=2e5+5;
int a[N];
void solve()
{
int n,s;
cin>>n>>s;
int sum=0;
for(int i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
}
if(sum<s)
{
cout<<"-1"<<endl;
return;
}
int l=0,r=0;
sum=a[0];
int ans=0x3f3f3f3f;
while(l<n&&r<n)
{
if(sum==s){
ans=min(ans,l+n-r-1);
sum+=a[++r];
}else if(sum>s)
{
sum-=a[l++];
}else{
sum+=a[++r];
}
}
cout<<ans<<endl;
}
signed main(){
IOS
int t;
cin>>t;
// int t=1;
while(t--)
{
solve();
}
}

F - 年

链接: https://codeforces.com/problemset/problem/1692/F
分析:
要让三个数相加末尾为 3,这只和数字的个位有关,我们存下数组中每个数的个位出现次数,然后三重循环枚举 0~10 之间的数字之和。就可以得到答案。

代码实现:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
int a[15];
void solve()
{
memset(a,0,sizeof a);
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int m;
cin>>m;
a[m%10]++;//这里只记录数字个位的出现次数。
}
bool flag=false;
for(int i=0;i<=9;i++){
for(int j=0;j<=9;j++){
for(int k=0;k<=9;k++){
a[i]--;a[j]--;a[k]--;
if((i+j+k)%10==3&&a[i]>=0&&a[j]>=0&&a[k]>=0)
{
flag=true;
break;
}
a[i]++;a[j]++;a[k]++;
}
if(flag)break;
}
if(flag)break;
}
if(flag)cout<<"YES"<<endl;
else cout<<"NO"<<endl;

}
signed main(){
IOS
int t;
cin>>t;
// int t=1;
while(t--)
{
solve();
}
}

G - 快

链接: https://codeforces.com/problemset/problem/1692/G
分析:
有多少段长度为 k 的区间满足题目中所说的性质。根据题目的公式可以发现,其实就是要求 ,所以就是求连续区间满足这个条件且满足区间长度为k+1 的区间个数。从第一个数字开始遍历即可。
代码实现:

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
27
28
29
30
31
32
33
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
const int N=2e5+5;
int a[N];
void solve()
{
int n,k;
cin>>n>>k;
for(int i=1;i<=n;i++)cin>>a[i];
int len=1;
int ans=0;
for(int i=2;i<=n;i++)
{
if(2*a[i]>a[i-1])
{
len++;
}else len=1;
if(len>k) ans++;//这里只要这段区间的长度一直在变大,这类区间的个数就可以一直增加,不进行len--操作也可以。
}
cout<<ans<<endl;
}
signed main(){
IOS
int t;
cin>>t;
// int t=1;
while(t--)
{
solve();
}
}

H - 乐

链接: https://atcoder.jp/contests/abc438/tasks/abc438_e
分析:
用 st[N][35] 来表示第 i 个水桶,传递了 次后这个桶在谁手里
把每个桶的初始状态都设为 st[i][0] 表示传递 0 次,桶还在自己手里。
这里用二进制来拼凑出总步数。比如 10 的二进制是
用 sum[N][35] 来表示第 i 个水桶,经过 次操作后,会积累多少水。
初始时 sum[i][0]=i
代码实现:

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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
const int N=2e5+5;
int st[N][35];//用来表示第i个水桶,传递了2的j次后这个桶在谁手里
//这里用二进制的思想,把一个数拆分。
int sum[N][35];
void solve()
{
int n,q;
cin>>n>>q;
for(int i=1;i<=n;i++)
{
cin>>st[i][0];
sum[i][0]=i;
}
for(int i=1;i<31;i++)//对于int类型的二进制数最多只有31位
{
//递归计算
for(int j=1;j<=n;j++)//桶编号
{
st[j][i]=st[st[j][i-1]][i-1];
sum[j][i]=sum[j][i-1]+sum[st[j][i-1]][i-1];
}
}
while(q--)
{
int t,b;
cin>>t>>b;
int ans=0;
for(int i=0;i<31;i++)
{
if(t>>i&1){
ans+=sum[b][i];
b=st[b][i];
}
}
cout<<ans<<endl;
}
}
signed main(){
IOS
int t=1;
while(t--)
{
solve();
}
}

欢迎关注我的微信公众号呀微信公众号文章链接

  • 标题: 大一第七次周赛题解
  • 作者: Lionlnuc
  • 创建于 : 2025-12-28 00:00:00
  • 更新于 : 2025-12-28 00:00:00
  • 链接: https://lionlnuc.github.io/2025/12/28/大一第七次周赛/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论
目录
大一第七次周赛题解