第一道题
思路:
第Q个和倒数第Q个,每一位相加都等于n+1。(我惊呆了!)
#include <iostream>
using namespace std;
int main()
{
int n;
int tmp;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&tmp);
printf("%d ",n-tmp+1);
}
return 0;
}
第二道题
思路:一共n个数,我们只用考虑3个最大的数就行了,只要最大的比两个次大的小就OK
#include <iostream>
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n;
scanf("%d",&n);
long long max1=0,max2=0,max3=0;
while(n--){
long long a;
scanf("%lld",&a);
if(a<max1)
continue;
max1=a;
if(a<max2)
continue;
max1=max2;
max2=a;
if(a<max3)
continue;
max2=max3;
max3=a;
}
if(max3<max2+max1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
return 0;
}
第三道题
思路:
题意为找ai+aj=奇数就交换这两个数尽可能的是最后的序列字典序最小。
显然如果这个数列全是奇数或者全是偶数就没必要交换否则就直接sort。
# python
n=int(input())
a=list(map(int,input().split()))
odd=0;even=0
for i in a:
if i%2: odd=1
else:even=1
if odd and even:
print(*sorted(a))
else:print(*a)
# c++
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string.h>
#include<map>
using namespace std;
long long int n,m,k,flag=0,a[1000009];
map<int,int>b;
int main(){
while(cin>>n)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int odd=0,pdd=0;
for(int i=1;i<=n;i++)
{
if(a[i]%2==1)
{
odd++;
}
else
pdd++;
}
if(odd&&pdd)
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
cout<<a[i]<<' ';
cout<<endl;
}
}
第四道题
不会!?♂️
思路:
作者:NotDeep
链接:https://www.nowcoder.com/discuss/216237?type=0&order=0&pos=5&page=3
来源:牛客网
#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;
}
参考:
https://www.nowcoder.com/discuss/216237?type=0&order=0&pos=5&page=3