算法99---网易2019笔试
题一:
'''
判断一个列表中的每个数的左右两个数之和是否大于当前的数,如果是,就能成环;如果否,就不能成环
'''
作者:NotDeep
链接:https://www.nowcoder.com/discuss/216237
来源:牛客网
思路
首先对数组进行排序,除了最后一个数字,都满足相邻两个数字大于自己
对于最后一个数字,交换最后两个数字,判断是否满足条件即可。
如:
输入:1 2 4
输出:NO
输入:1 2 3
输出:YES
参考代码
#include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> #include <string> using namespace std; const int N = 1e5 + 10; int a[N]; int main() { int t; scanf("%d",&t); while (t--) { int n; scanf("%d",&n); for (int i = 0;i < n;i++) scanf("%d",&a[i]); sort(a,a+n); swap(a[n-2],a[n-1]); bool f = 0; for (int i = 0;i < n;i++) { int pre = (i-1+n)%n; int sub = (i+1) % n; if (a[pre] + a[sub] <= a[i]) f = 1; } if (f) puts("NO"); else { puts("YES"); } } return 0; }
题二:
'''
给数组arr=[a1,a2,...,an]
对于数组中的两个下标,如果ai+aj=奇数,就可以交换ai和aj
现在允许使用操作次数不限制,希望通过若干次操作可以得到字典序最小的数组
'''
如:
输入:7 3 5 1
输出:7 3 5 1
思路:
只要数组中同时出现了奇数和偶数,那么直接对数组进行排序即可。
代码:
作者:NotDeep 链接:https://www.nowcoder.com/discuss/216237 来源:牛客网 #include <iostream> #include <algorithm> #include <stdio.h> #include <cstring> #include <cmath> const int N = 1e5 + 10; int a[N]; using namespace std; int main() { int n; cin >> n; int odd = 0,even = 0; for(int i=0;i<n;i++) { cin>>a[i]; if(a[i]%2==0) even++; else odd++; } if(even>0 && odd>0) sort(a,a+n); for(int i=0;i<n;i++) { printf("%d%c", a[i], i == n - 1 ? '\n' : ' '); } return 0; }
题三:优秀的01序列
http://www.lyqhahaha.xyz/P/72/
给出优秀的01序列S,其中满足两个操作,S+S,reverse(S)也是优秀的01序列,则再给出T序列,请判断T是否是优秀的01序列。
且reverse(S)操作是0变1,1变0,如果最前面为0则要删掉,如S=110011,reverse(S) = 1100,S+S= 110011110011
代码:
作者:NotDeep 链接:https://www.nowcoder.com/discuss/216237 来源:牛客网 #include<bits/stdc++.h> using namespace std; char s[1005] , t[1005]; int h[1005]; const int base = 773117 , mod = 1e9 + 7; int pr[1005]; int s1[1005] , s2[1005] , len; int pos[1005]; int n , m; int ghash(int l,int r) { return ((h[r] - 1LL*h[l-1]*pr[r-l+1]) % mod + mod ) % mod; } int dp[1005][2]; void solve() { scanf("%s",s+1); scanf("%s",t+1); n = strlen(s + 1) , m = strlen(t + 1) ; for(int i = 1;i <= m;i++) h[i] = (1LL * h[i - 1] * base + t[i] - '0') % mod; int pc = 0;len = 0; for(int i = 1;i <= n;i++) { if(s[i] != s[i - 1]) { int h1 = 0 , h2 = 0; for(int j = i;j <= n;j++) { h1 = (1LL * h1 * base + s[j] - '0') %mod; h2 = (1LL * h2 * base + 1 + '0' - s[j]) % mod; } if(!pc) { ++len ; s1[len] = h1 ; s2[len] = h2; } else { ++len ; s1[len] = h2 ; s2[len] = h1 ; } pos[len] = (n - i + 1) ; pc ^= 1; } } memset(dp , 0 , sizeof(dp)) ; dp[0][1] = 1; for(int i = 1;i <= m;i++) { if(i >= pos[1] && ghash(i - pos[1] + 1 , i) == s1[1] && (dp[i - pos[1]][0] || dp[i - pos[1]][1])) dp[i][1] = 1; for(int j = 2;j <= len;j++) { if(i >= pos[j] && ghash(i - pos[j] + 1 , i) == s1[j] && (dp[i - pos[j]][0] || dp[i - pos[j]][1])) {dp[i][0] = 1;break;} } for(int j = 1;j <= len;j++) { if(i >= pos[j] && ghash(i - pos[j] + 1 , i) == s2[j] && dp[i - pos[j]][0]) {dp[i][0] = 1;break;} } } if(dp[m][0] || dp[m][1]) puts("YES"); else puts("NO"); return ; } int main() { int t;scanf("%d",&t) ; pr[0] = 1; for(int i = 1;i <= 1000;i++) pr[i] = 1LL * pr[i - 1] * base % mod; while(t--) solve() ; return 0; }