NC253625. Kevin的矩阵
描述
输入描述
第一行包含一个整数,表示测试用例的组数。
对于每组测试用例:
第一行包含三个整数,分别表示序列的长度,初始矩阵的列数和目标数字。
第二行包含个整数
,表示该序列。
保证对于所有的测试用例,的总和不超过
。
输出描述
对于每组测试用例:
仅输出一行,包含一个整数,表示答案。
示例1
输入:
2 17 4 1 1 2 3 4 5 1 6 7 8 9 1 2 3 4 5 8 9 5 3 3 1 2 3 4 5
输出:
2 0
说明:
样例解释见题目描述。pypy3 解法, 执行用时: 4370ms, 内存消耗: 41304K, 提交时间: 2023-07-14 21:31:35
import sys input = sys.stdin.readline t = int(input()) for _ in range(t): n,m,k = map(int,input().split()) a = list(map(int,input().split())) Mx = 2 * int(n ** 0.5) + 10 if m >= n: print(int(k not in a)) continue ans = 10**18 for i in range(max(1,m - Mx),min(n,m + Mx) + 1): cnt = [0] * i for j in range(n): if a[j] != k: cnt[j % i] += 1 ans = min(ans,abs(i - m) + min(cnt)) print(ans)
C++(clang++ 11.0.1) 解法, 执行用时: 339ms, 内存消耗: 1196K, 提交时间: 2023-07-16 15:38:42
#include<bits/stdc++.h> using namespace std; int a[200010]; void f() { int n,m,k; cin>>n>>m>>k; for(int i=1;i<=n;i++) { cin>>a[i]; } int s=2*sqrt(n)+1,num=1e9,ans=0; for(int i=max(m-s,1);i<=min(s+m,n);i++) { for(int j=1;j<=i;j++) { ans=0; for(int l=j;l<=n;l+=i) { if(a[l]!=k) { ans++; } } num=min(num,abs(i-m)+ans); } } cout<<num<<endl; } int main() { int t; cin>>t; while(t--) { f(); } return 0; }
C++(g++ 7.5.0) 解法, 执行用时: 305ms, 内存消耗: 1192K, 提交时间: 2023-07-15 13:09:39
#include<iostream> #include<math.h> using namespace std; int a[200005]; int main() { int t; cin>>t; while(t--) { int n,m,g,ans=0,num=1e9; cin>>n>>m>>g; for(int i=1;i<=n;i++) cin>>a[i]; int s=2*sqrt(n)+1; for(int i=max(m-s,1);i<=min(s+m,n);i++) { for(int j=1;j<=i;j++) { ans=0; for(int k=j;k<=n;k+=i) { if(a[k]!=g) ans++; } num=min(num,abs(i-m)+ans); } } cout<<num<<endl; } }