中午睡醒两点多了才发现有比赛,
然后就随手签个到抽个奖这样子,,,并没有打完

B 小宝的幸运数组

链接:https://ac.nowcoder.com/acm/contest/11746/B
来源:牛客网

题目描述
对于小宝来说,如果一个数组的总和能够整除他的幸运数字k,就是他的幸运数组,而其他数组小宝都很讨厌。现在有一个长度为n的数组,小宝想知道这个数组的子数组中,最长的幸运子数组有多长。

对于子数组的定义,如果可以通过从开头和从结束分别删除若干个(可以为零或全部,前后删除个数不必相同)元素来从数组b获得数组a,则称数组a是数组b的子数组。(子数组包含原数组,但不包含空串)

输入描述:
多组输入。第一行包含一个整数T(1≤T≤10),表示有T组测试数据。

每组测试数据包含两行,第一行包含两个整数n和k(1≤n≤105,1≤k≤105),分别表示数组长度和小宝的幸运数字。第二行包含n个空格分隔的整数a1,a2,.,an(0≤ai≤10^9),为数组的元素。

输出描述:
对于每组数据,输出和能被k整除的最长子数组的长度。如果没有这样的子数组,则输出−1。
示例1
输入
复制
4
3 3
1 2 3
3 5
1 2 3
3 7
1 2 3
1 6
5
输出
复制
3
2
-1
-1

//题意:给出数组(1e5),求能被k整除的最长连续子序列
/*
如果(a+b)%mod=k,(a+b+c+d+e)%mod也=k,那么(c+d+e)%mod=0,,然后cde就是mod的整数倍,,直接输入的时候前缀和取模,如果遇到和之前一样的就更新长度,输出就行了
*/
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL a[1000001];
int main(){
ios::sync_with_stdio(false);
int T; cin>>T;
while(T--){
LL n, m; cin>>n>>m;
a[0] = 0;
map<LL,LL>ma; ma[0] = 0;
LL mx = 0;
for(LL i = 1; i <= n; i++){
LL x; cin>>x;
a[i] = (a[i-1]+x)%m;
if(!ma.count(a[i])){
ma[a[i]] = i;
}else{
mx = max(mx,i-ma[a[i]]);
}
}
if(mx==0)cout<<"-1\n";
else cout<<mx<<"\n";
}
return 0;
}

I 买花

链接:https://ac.nowcoder.com/acm/contest/11746/I
来源:牛客网

题目描述
情人节马上要到了,阳阳想送出n朵花给喜欢的妹妹,他打算提前开始买。但是,因为他有强迫症,所有的花要分k天买(k>1,即不能一天全买完),第一天他可以买任意朵花,之后每一天买花的数量为前一天的两倍,(如若第一天买4朵,第二天就要买8朵,以此类推)。

现在离情人节还有15天(k≤15),请你告诉阳阳,他能不能刚好买到n朵花。

输入描述:
多组输入。第一行一个正整数T(1<=T<=10^5),表示数据组数。

接下来T行,每行一个正整数n(1<=n<=10^9),表示预计买花的数量。

输出描述:
每组数据输出一行,共T行。

判断能否刚好买到n朵花,可以则输出"YE5",否则输出"N0"。

示例1
输入
复制
2
21
20
输出
复制
YE5
N0

//题意:给出n(1e9),求是否是等比数列的和,项数少于15
//a1(2^k-1)=n, 2<=k<=15.
#include<bits/stdc++.h>
using namespace std;
int di[14] = {3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767};
int main(){
int T; cin>>T;
while(T--){
int n; cin>>n;
int ok = 0;
for(int i = 0; i < 14; i++){
if(n%di[i]==0){
ok = 1; break;
}
}
if(ok==1)cout<<"YE5\n";
else cout<<"N0\n";
}
return 0;
}

J这是一题简单的模拟

链接:https://ac.nowcoder.com/acm/contest/11746/J
来源:牛客网

题目描述
财务计划要从家里出发,去N个城市出差,然后再回到家中,但N个出差地点之间不一定都能通车,现在他要筛选出花费最少的路径,你能帮帮他吗?
输入描述:
第一行为两个正整数N和M(1≤N≤300,1≤M≤N(N+1)/2),分别表示有N个出差地点和这些地点之间的M条通路,其中出差地点用1到N编号,而财务的家所在城市用编号0表示。

随后的M行,每行给出通路连接的两个城市和这条通路上的花费,格式为:

城市A 城市B 花费

通路是双向的,且两个城市间最多有一条通路,不存在自环。保证所有花费大于0。
再下一行给出一个正整数K(K<=20000),表示现在有K条推荐路径(注意:给出的路径不一定能通过或可能不满足财务的要求)。

接下来K行每一行表示一个推荐路径,第一个整数n表示途径的城市数,后面有n(n<=2*N)个整数xi(1≤xi≤N)(表示途经的城市(不包括财务的家),如:

3 1 2 3
表示实际路径为0→1→2→3→0。

输出描述:
请你检验给出的K条推荐路径,当它满足:

1.给出的路径能实际通车,即路径中相邻城市存在通路;
2.给出的路径恰好能都到达N个出差城市一次,即不能漏掉某个城市,也不能重复到达。

则称这条路径是可行的。

对于给出的K条推荐路径,请输出其中可行路径中最少的花费,若不存在可行路径,请输出"-1"。(题目保证花费和不超过int范围)

示例1
输入
复制
5 10
0 1 5
0 5 12
1 2 2
2 3 8
3 4 13
1 3 11
0 2 5
0 4 9
4 5 6
3 5 7
5
5 1 3 2 3 1
5 3 2 1 4 5
5 2 1 3 5 4
6 1 2 3 4 5 1
5 1 2 3 5 4
输出
复制
37

//+ n个点m条带权边。给出k条路径,判断能否从v1出发经过每个点一次并返回v1,输出最短的路径。
//+ n<200 所以邻接矩阵存个图,直接暴力枚举就行。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int inf = 1e9+10;
const int maxn = 350;
int e[maxn][maxn], vis[maxn];
int main(){
int n, m;
cin>>n>>m;
for(int i = 0; i <= n; i++)
for(int j = 0; j <= n; j++)
e[i][j] = inf;
for(int i = 1; i <= m; i++){
int u, v, w;
cin>>u>>v>>w;
e[u][v] = e[v][u] = w;
}
int k; cin>>k;
int cnt = 0, po = 0, hf = inf;
for(int i = 1; i <= k; i++){
memset(vis,0,sizeof(vis));
int kk; cin>>kk;
int la = 0, tmphf = 0, ok = 1;
for(int j = 1; j <= kk; j++){
int x; cin>>x;
if(e[la][x]!=inf && !vis[x]){
//cout<<tmpfile<<" "<<e[la][x]<<"\n";
tmphf += e[la][x];
//cout<<tmpfile<<"\n";
la = x;
vis[x]++;
}else{
ok = 0;
}
}
for(int i = 1; i <= n; i++){
if(vis[i]!=1)ok = 0;
}
if(ok && e[la][0] != inf){
tmphf += e[la][0];
cnt++;
//cout<<i<<": "<<tmphf<<"\n";
if(tmphf < hf){
hf = tmphf;
po = i;
}
}
}
//cout<<cnt<<"\n";
//cout<<po<<" "<<hf<<"\n";
if(cnt==0)cout<<"-1"<<"\n";
else cout<<hf<<"\n";
return 0;
}