JWT
在写项目的时候,本来想着把用户的数据全部存入session这样的话就不用每次都需要带用客户端的账号。后面了解到JWT,这个是在服务器无状态的一个方式。
具体是分为三个部分,第一个是头部主要存储用到的算法等信息,第二个是载荷,这里不能存储重要的信息,只能存储一些基本信息,第三部分是签名部分。
使用base64对数据进行了编码。
解析:
题解:
暑假第二周练习题 - Virtual Judge (vjudge.net)
这道题是一个构造题,很简单,就是需要构造一个最大值为s-r的,剩下的n-1个数字必须总和为r,并且最大值不能为s-r。
把s-r除以n-1 ,再把余数平均分配就行。
#include<stdio.h>
int main()
{
long long n,s,r,i,t,x,y;
scanf("%lld",&t);
while(t--)
{
scanf("%lld%lld%lld",&n,&s,&r);
//n个色子,和为s,拿走一个最大的和为r
//要保证接下来,最小的是1
printf("%lld ",s-r);
x=r/(n-1);
y=r-x*(n-1);
if(x==s-r&&y==0)
{
for(i=1;i<n;i++)
{
printf("%lld ",s-r);
}
}
else
{
for(i=1;i<=y;i++) printf("%lld ",x+1);
for(i=y+1;i<n;i++) printf("%lld ",x);
}
printf("\n");
}
return 0;
}
暑假第二周练习题 - Virtual Judge (vjudge.net)
这个是找出连续区间段和最小的一个题目
确定边界 左边界是 这个数组的最大值,因为分成一段每个数字只有一个最小值就是 数字最大值,
右边界是数组的总体前缀和,最少分成1段。
然后二分去求解,得出的这个解去暴力去分段,看满不满足就行
#include<stdio.h>
#include<algorithm>
#define Maxsize 200010
using namespace std;
struct node
{
int num;
int pos;
}a[Maxsize];
bool cmp(node a,node b)
{
return a.num>b.num;
}
void init(int n)
{
int i;
for(i=0;i<=n;i++)
{
a[i].pos=a[i].num=0;
}
}
int main()
{
int t,n,i,j,x;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
init(n);
for(i=0;i<n;i++)
{
for(j=1;j<n;j++)
{
scanf("%d",&x);
a[x].num+=n-j+1;
a[x].pos=x;
}
}
sort(a+1,a+n+1,cmp);
for(i=1;i<=n;i++)
printf("%d ",a[i].pos);
puts("");
}
return 0;
}
暑假第二周练习题 - Virtual Judge (vjudge.net)
这道题就是求连续的递增为1的序列 最少有几个
使用map映射,看对应的值有几个,一般来说相同的数字的个数是最大的一个序列,但是还是要看一些其他情况。
map映射后,差分一下递增的序列的个数之差,就能知道最小序列是多大了
#include<stdio.h>
#include<map>
#include<algorithm>
#define Maxsize 200010
using namespace std;
int a[Maxsize],b[Maxsize];
map<int,int> mymap;
int main()
{
//排序,找出最多一样的数字
int n,i,t,mmin=0,k=0,j,m,res;
scanf("%d",&t);
while(t--)
{
k=0;
mmin=-1;
j=0;
res=0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
mymap[a[i]]++;
}
for(auto i:mymap)
{
if(mmin+1!=i.first) m=0;
res+=max(0,i.second-m);
mmin=i.first;
m=i.second;
}
mymap.clear();
printf("%d\n",res);
}
return 0;
}
暑假第二周练习题 - Virtual Judge (vjudge.net)
转换成9进制没有4就可以了。
#include<stdio.h>
int main()
{
long long n,t,i;
int a[10]={0,1,2,3,5,6,7,8,9};
scanf("%lld",&t);
while(t--)
{
int res[100]={0},k=0;
scanf("%lld",&n);
while(n)
{
res[k++]=a[n%9];
n/=9;
}
for(i=k-1;i>=0;i--)
printf("%d",res[i]);
puts("");
}
return 0;
}
暑假第二周练习题 - Virtual Judge (vjudge.net)
map映射就行,需要考虑到会出现重复的单词
#include<stdio.h>
#include<map>
#include<string>
#define Maxsize 110
using namespace std;
map<string,int> mymap;
char a[Maxsize][50],b[Maxsize][50];
long long price[Maxsize];
int main()
{
int n,m,i,p0;
long long res=0;
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%s",a[i]);
mymap[a[i]]++;
}
//是因为会出现重复的吧
for(i=1;i<=m;i++)
{
scanf("%s",b[i]);
}
scanf("%d",&p0);
for(i=1;i<=m;i++)
{
scanf("%lld",&price[i]);
if(mymap[b[i]])
{
res+=mymap[b[i]]*price[i];
mymap[b[i]]=0;
}
}
map<string, int>::iterator iter;
for (iter = mymap.begin(); iter != mymap.end(); iter++) {
if(iter->second!=0)
{
res+=p0*(iter->second);
}
}
// for(auto i:mymap){
// if(i.second==2)
// {
// res+=p0;
// }
// }
printf("%lld\n",res);
return 0;
}
暑假第二周练习题 - Virtual Judge (vjudge.net)
记住(出现的位置,每次出现 )就找到最近的( 的位置进行刷新保存就行
#include<stdio.h>
#define Maxsize 200010
char stack[Maxsize],str[Maxsize];
int top;
int main()
{
int n,i,a[Maxsize]={0},k=0,j;
char ch;
scanf("%d\n",&n);
scanf("%s",str);
for(i=0;i<n;i++)
{
ch=str[i];
if(ch=='(')
{
a[k++]=top;
stack[top++]=ch;
//当前位置记录
}
else if(ch==')')
{
if(k>0)
{
//说明当前位置是有的
top=a[k-1];
k--;
}
else stack[top++]=ch;
}
else stack[top++]=ch;
// if(ch==')')
// {
// int k=top;
// k--;
// while(k>=0&&stack[k]!='(') k--;
// if(k>=0) top=k;
// }
}
for(i=0;i<top;i++)
{
putchar(stack[i]);
}
puts("");
return 0;
}
暑假第二周练习题 - Virtual Judge (vjudge.net)
无脑模拟单调队列,滑动窗口
(1条消息) 滑动窗口算法_lxh0113的博客-CSDN博客
#include<stdio.h>
#define N 1000010
int n,k,a[N],que[N],head,tail;
int main()
{
int i,j;
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
head=1;tail=0;
for(i=1;i<=n;i++)
{
if(head<=tail&&que[head]<i-k+1) head++;
while(head<=tail&&a[i]<=a[que[tail]]) tail--;
que[++tail]=i;
if(i>k-1) printf("%d ",a[que[head]]);
}
puts("");
head=1;tail=0;
for(i=1;i<=n;i++)
{
if(head<=tail&&que[head]<i-k+1) head++;
while(head<=tail&&a[i]>=a[que[tail]]) tail--;
que[++tail]=i;
if(i>k-1) printf("%d ",a[que[head]]);
}
return 0;
}
暑假第二周练习题 - Virtual Judge (vjudge.net)
我用的是归并排序,然后找到对应的排序后的位置所在和现在的差距
主要是 当前位置减去 应该排序的位置的已经存在于前面的个数
#include<stdio.h>
#include<math.h>
#define Maxsize 500010
int a[Maxsize],b[Maxsize];
long long res=0;
void merge(int l,int m,int r)
{
int i,j,k=0;
for(i=l,j=m+1;i<=m&&j<=r;)
{
if(a[i]>a[j])
{
res+=abs(j-l-k);
b[k++]=a[j++];
}
else
{
res+=abs(i-l-k);
b[k++]=a[i++];
}
}
while(i<=m) {res+=abs(i-l-k);b[k++]=a[i++];}
while(j<=r) {res+=abs(j-l-k);;b[k++]=a[j++];}
for(i=l;i<=r;i++) a[i]=b[i-l];
}
void sort(int l,int r)
{
int m=(l+r)/2;
if(l>=r)
{
return ;
}
sort(l,m);
sort(m+1,r);
merge(l,m,r);
}
int main()
{
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
sort(0,n-1);
printf("%lld\n",res/2);
return 0;
}