先说第六场。(昨天做的)三个小时,6道题。
A题,最先看是就是这道题。一开始,估计有点小小紧张。没看懂题意。后来又看,看懂了。Pe了一次。
在交代码前,有想到过这个问题。(最后有没有空格,心想,格式要求应该不太严格吧,以前没有出现过Pe,就没有改)。
果断就Pe了,后来想,如果对格式要求严一点的话,绝对不会有这一次Pe。完全可以花一分钟处理一下。
B题比较难懂,读了比较长的时间吧。代码调试了好久,(因为自己有犯了错了,没有确定模拟的确定思路,导致,在写的过程中,改变了几次处理方式)。还是那句话,多想。想完再写。WA了一次,一个小小的bug。
C题是一个数论。有待学习。
D题,游戏,石头剪刀布,判输赢。
E题,又是值得深思的一道题目。网络流?最小生成树?并查集?各种方法都有ac的。我认为应该是一道深搜题吧。不过,不会写深搜也就做罢了。
F题没人做。也搞不懂。
总体来说,这次比赛,状态不是最好的。
完全可以避免的两次WA。还有自己臆断的E题。认为是深搜,就不在去想其他的方法了。实在不应该。
第五场。
A题,一个水题。
B题,简单的问题。赛前,看到过这道题,不过没有做。深度感觉自己对位运算的理解不够。继续学习。
题目就是,让优化所给代码。就是给一系列的整数,让每个整数或所有整数(包括自己)。其实,如果对位运算理解还够可以的话,这简直就是一道大水题。不过自己对位操作的理解还有待提高。没事,我还有未来。
对于或操作,我们可以这么理解,看下图;
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#define CLR(arr,val) memset(arr,val,sizeof(arr))
using namespace std;
const int N=10004;
const int M=16;
struct Number{
int x;
int y[M];
}num[N];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n,sum[M];
CLR(sum,0);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&num[i].x);
int k=num[i].x,top=0;
CLR(num[i].y,0);
while(k!=0){
num[i].y[top]=k&1;
sum[top]+=(k&1);
k/=2;top++;
}
}
int ans=0;
for(int i=1;i<=n;i++){
for(int j=0;j<M;j++){
if(num[i].y[j]==1){
ans+=(n*(int)pow(2,j));
}
else{
ans+=(sum[j]*(int)pow(2,j));
}
}
}
printf("%d\n",ans);
}
return 0;
}
J题直接暴力的,由于10000以内的素数是仅仅有3000+,然后加上一个hash的思想就是3000+*3000+的复杂度,还是可以接受的。水之。
这场比赛就做了两个小时,实在做不下了,就溜了。我擦,现在想想,这是什么状态。。实在不该。
比赛就剩下4场了。继续加油。
可以肯定的是自己的状态一下回暖,加油!!