date: 2019-08-28
前言
比赛链接:Codefest 19
A题
思路:
这是一道水题。你对着样例递推打一个表出来,会发现结果三个一组循环。
例如:A = [3, 4, 7, 3, 4, 7, 3, 4, 7, ...]
好了,我们只需要读入第0和第1项,把他们的异或值作为第2项,输出n对3取模的那一项就好。
代码:
#include<bits/stdc++.h>
using namespace std;
int T,a[3],n;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--){
cin>>a[0]>>a[1]>>n;
a[2]=a[0]^a[1];
cout<<a[n%3]<<endl;
}
return 0;
}
B题
思路:
这道题很容易暴力并且超时,首先用O(N^2)二重循环枚举去掉的区间,之后再O(NlogN)从头到尾跑一遍判重,复杂度是O(N^3logN)。
但是,我们先枚举从头开始的留下来的区间的长度(保证内部没有重复的),对于每一次枚举,右边的留下的长度都满足单调性,但是应该不可以二分(也可能我不会),相反,直接从右往左跑一遍判重就可以了。复杂度O(N^2logN)(log是因为使用了set来判重)。
代码:
#include<bits/stdc++.h>
using namespace std;
int n;
int a[2005];
set<int> s;
int ans,l,r;
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ans=n;
for(int i=0;i<=n;i++){
if(s.find(a[i])!=s.end()){
break;
}
s.insert(a[i]);
set<int> t;
for(int j=n;j>=1;j--){
if(s.find(a[j])!=s.end()||t.find(a[j])!=t.end()){
ans=min(ans,j-i);
break;
}
t.insert(a[j]);
}
}
cout<<ans<<endl;
return 0;
}
C题
思路:
复制很多遍样例就可以AC(真的)。
你把大的矩阵分割成很多4行4列的矩阵,之后你就可以把样例1的Output填上去。从左往右,从上往下第i个(从0开始数)矩阵的元素要加上16*i
。
代码:
此处我没有复制样例直接使用如下矩阵作为复制母版:
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
其实他们的异或值也是相等的。
#include<bits/stdc++.h>
using namespace std;
int n;
int cur;
int g[1005][1005];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=0;i<n;i+=4){
for(int j=0;j<n;j+=4){
for(int k=0;k<4;k++){
for(int l=0;l<4;l++){
g[i+k][j+l]=cur++;
}
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cout<<g[i][j]<<' ';
}
cout<<endl;
}
return 0;
}
结束
从D开始我都不会做,所以就酱~