刷题:
第一周任务 - Virtual Judge (vjudge.net)
1.这一题的思路就是先排除前面和后面相等的,然后找到不等的情况,不等情况的下标开始前后都走,看看是不是和b数组构成了一个升序数组即可。
#include<stdio.h>
#define MaxN 200010
int a[MaxN],b[MaxN];
int main()
{
int t,n,i,j,res,min,max;
scanf("%d",&t);
while(t--)
{
res=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(i=0;i<n;i++)
{
scanf("%d",&b[i]);
}
for(i=0;i<n&&a[i]==b[i];i++);
for(j=n-1;j>=0&&a[j]==b[j];j--);
min=i;
max=j;
i--;
for(;i>=0;i--)
{
if(b[i]<=b[i+1]) min=i;
else break;
}
j++;
for(;j<n;j++)
{
if(b[j]>=b[j-1]) max=j;
else break;
}
printf("%d %d\n",min+1,max+1);
}
return 0;
}
第一周任务 - Virtual Judge (vjudge.net)
1.这道题的主要思路是穷举。
2.穷举出现的所有字母,这个字母在这个单词里面出现的的位置之间,有多少间隔的字母,我们找出最长的间隔,去求出log2的间隔数字即可,因为每次都删掉不相邻的数字,一共要删掉log2次。
3.然后就是要注意,最后面和第一次出现该字母到首字母的位置间隔,也是要算的。
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<vector>
#define MaxN 200010
char str[MaxN];
using namespace std;
vector<int> alp[26];
int MAX(int a,int b)
{
if(a>b) return a;
return b;
}
int weishu(int x)
{
int sum=0;
while(x)
{
x=x&(x-1);
sum++;
}
return sum;
}
int main()
{
int t,i,n,pre,res,j,len,ans;
scanf("%d",&t);
while(t--)
{
scanf("%s",str);
n=strlen(str);
ans=n;
for(i=0;i<n;i++)
{
alp[str[i]-'a'].push_back(i);
}
for(i=0;i<26;i++)
{
res=0;
pre=-1;
alp[i].push_back(n);
for(j=0;j<(alp[i].size());j++)
{
len=alp[i][j]-pre-1;
if(len) res=MAX(res,log2(len)+1);
pre=alp[i][j];
}
if(ans>res) ans=res;
alp[i].clear();
}
printf("%d\n",ans);
}
return 0;
}
第一周任务 - Virtual Judge (vjudge.net)
1.这道题的思路是,我们遇到一个_判断它前面是不是_即可,需要注意的是前面有一个_或者后面出现了这个字符。
2,另外^的情况需要特殊考虑
#include<stdio.h>
int main()
{
int t,i,j,sum;
char str[200];
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%s",str);
for(i=0;str[i];i++)
{
if(str[i]=='^') continue;
if(i==0||str[i-1]=='_') sum++;
}
if(str[i-1]=='_') sum++;
if(i==1&&str[0]=='^') sum=1;
printf("%d\n",sum);
}
return 0;
}
第一周任务 - Virtual Judge (vjudge.net)
1.这个题目是一个特判的问题。
2.最多是4个,因为我们单独把一个细胞包围起来即可,我们特殊判断边界条件即可。
#include<stdio.h>
int main()
{
int t,n,m,x1,x2,y1,y2;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
if((x1==1&&y1==1)||(x1==n&&y1==m)||(x2==1&&y2==1)
||(x2==n&&y2==m)||(x1==1&&y1==m)||(x1==n&&y1==1)
||(x2==1&&y2==m)||(x2==n&&y2==1))
{
printf("2\n");
}
else if((x1==1)||(x1==n)||(y1==1)||(y1==m)
||(x2==1)||(x2==n)||(y2==1)||(y2==m))
{
printf("3\n");
}
else printf("4\n");
}
return 0;
}
第一周任务 - Virtual Judge (vjudge.net)
1.这一题,180度旋转相等,其实就是说,反转后对应颜色是否相等。
2.如果为奇数,最终的sum小于k,我们一直翻转中间那个颜色就可以保证,这个是对称相等的。如果是偶数,那么我们需要保证sum-k的值必须为偶数,因为偶数翻转之后需要对应把另外一边翻转。
3.我用的是亦或,然后值判断了一半的格子。
#include<stdio.h>
#define MaxN 1010
int a[MaxN][MaxN];
int main()
{
int t,n,k,i,j,sum;
scanf("%d",&t);
while(t--)
{
sum=0;
scanf("%d%d",&n,&k);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
for(i=0;i<n/2;i++)
{
for(j=0;j<n;j++)
{
sum+=a[i][j]^(a[n-1-i][n-1-j]);
}
}
if(n%2)
{
for(j=0;j<n/2;j++)
{
sum+=a[n/2][j]^(a[n/2][n-1-j]);
}
}
if(k>=sum&&(n%2||(k-sum)%2==0)) puts("YES");
else puts("NO");
}
return 0;
}
项目:
实现了,在服务端读取好友列表返回给客户端并且显示它。
通过上面这点,我主要学会了把MySQL语句得到的值转换成类list类型的数据,主要是以下这一段,然后把列表序列化返回给了客户端,并且读取出来。
后面去看了controller类之间如何传递数据:
先用map把对应的值存储下来
如何在另外的controller去通过get方法得到值。
今天遇到一个需要注意的点,序列化里面如果序列化了对象,这个对象也是需要序列化的,否则会报错。
接下来需要实现消息气泡,以及发送消息。了解到发送消息的气泡可以用lable显示,但是不知道如果固定长宽以及换行。