携程笔试java岗题解 20230907
ak了,结束后放题解
第一题 回溯
第二题
不同的节点三角形 n2复杂度
统计每一行和每一列的分别y,o,u个数,两重循环遍历第一个点的xy下标,如果是“y”,则结果为x行u个数乘y列o个数 加 x行o个数乘y列u个数,其余情况以此类推
第三题 加减次数
统计需要加,需要减,可以加,可以减的个数,处理即可
第四题
t为当前方案数,当新增一个0时,t+1,出现1时,t-1, 结果为+t,t为负数时不处理,当t为负数且出现一个0时方案数置为1
第一题 回溯
第二题
不同的节点三角形 n2复杂度
统计每一行和每一列的分别y,o,u个数,两重循环遍历第一个点的xy下标,如果是“y”,则结果为x行u个数乘y列o个数 加 x行o个数乘y列u个数,其余情况以此类推
第三题 加减次数
统计需要加,需要减,可以加,可以减的个数,处理即可
第四题
t为当前方案数,当新增一个0时,t+1,出现1时,t-1, 结果为+t,t为负数时不处理,当t为负数且出现一个0时方案数置为1
全部评论
第二题上半部分
int a[1010][1010];
int row[1010][5];
int col[1010][5];
int main() {
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
{
string t;
cin>>t;
for(int j=0;j<t.size();j++)
{
if(t[j] == 'y') a[i][j] = 1;
else if(t[j] == 'o') a[i][j] = 2;
else if(t[j] == 'u') a[i][j] = 3;
else a[i][j] = 4;
}
}
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
row[i][a[i][j]]++;
col[j][a[i][j]]++;
}
}
送花
回复 分享
最后一题是dp吗?有点事就提前交了,这题没做
送花
回复 分享
国泰君安
官网直投
一题
#include <iostream>
using namespace std;
int prime[50];
int ans;
int val[50];
int a[50];
void getAns(int k,int n)
{
if(k == n)
{
ans++;
return;
}
for(int i=1;i<=n;i++)
{
if(val[i]) continue;
if(k!=0 && prime[a[k-1]+i]) continue;
val[i] = 1;
a[k] = i;
getAns(k+1,n);
val[i] = 0;
}
}
int main() {
int n;
cin>>n;
prime[1] = 1;
prime[2] = 1;
prime[3] = 1;
for(int i=4;i<=20;i++)
{
int flag = 1;
for(int j=2;j<i;j++)
{
if(i % j == 0)
{
flag = 0;
break;
}
}
prime[i] = flag;
}
getAns(0,n);
cout<<ans<<endl;
}
送花
回复 分享
第三题
#include <iostream>
using namespace std;
int main() {
long long T;
cin >> T;
while (T--) {
long long n, l, r;
cin >> n >> l >> r;
long long needadd = 0;
long long needmin = 0;
long long canadd = 0;
long long canmin = 0;
for (long long i = 0; i < n; i++) {
long long t;
cin >> t;
if (t < l) needadd += l - t;
if (t > r) needmin += t - r;
if (t > l) canmin += t - l;
if (t < r) canadd += r - t;
}
// cout<<needadd<<" "<<canadd<<" "<<needmin<<" "<<canmin<<endl;
if (needadd > canmin || needmin > canadd) cout << -1 << endl;
else cout << max(needadd, needmin) << endl;
}
}
送花
回复 分享
第四题
#include <iostream>
(30316)#include<string>
using namespace std;
int main()
{
string a;
cin>>a;
long long ans = 0;
int t = 0;
for(int i=0;i<a.size();i++)
{
if(a[i] == '0')
{
if(t<0) t = 0;
t++;
if(t>0) ans+=t;
}
else if(a[i] == '1')
{
t--;
if(t>0) ans+=t;
}
}
cout<<ans<<endl;
}
送花
回复 分享
第二题下半部分
long long ans = 0;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(a[i][j] == 1)
{
ans+=row[i][2] * col[j][3];
ans+=row[i][3] * col[j][2];
}
if(a[i][j] == 2)
{
ans+=row[i][1] * col[j][3];
ans+=row[i][3] * col[j][1];
}
if(a[i][j] == 3)
{
ans+=row[i][2] * col[j][1];
ans+=row[i][1] * col[j][2];
}
}
}
cout<<ans<<endl;
}
送花
回复 分享
果然是大佬,题解很清晰!
送花
回复 分享
太强了
送花
回复 分享
tql
送花
回复 分享
相关推荐
点赞 评论 收藏
分享
投递招商银行等公司7个岗位 >
点赞 评论 收藏
分享