Link:
A:
判断如果一个方向有,其相反方向有没有即可
#include <bits/stdc++.h> using namespace std; char s[1005]; map<char,bool> mp; int main() { scanf("%s",s); for(int i=0;i<strlen(s);i++) mp[s[i]]=true; if(mp['S']==mp['N']&&mp['E']==mp['W']) puts("Yes"); else puts("No"); return 0; }
B:
贪心最大化利用即可
#include <bits/stdc++.h> using namespace std; int n,dat[100005]; long long res=0; int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&dat[i]); for(int i=1;i<=n-1;i++) { res+=dat[i]/2;dat[i]%=2; if(dat[i+1]>dat[i]) dat[i+1]-=dat[i],res+=dat[i]; } res+=dat[n]/2; printf("%lld",res); return 0; }
C:
可以将两个操作转换为:
1、交换两个相邻的数
2、交换两个中间相间一个的数
由于只要求操作1的最小数,可以发现调整好所有数的序号的奇偶性就能用操作2完成任务
因此求出原序号为奇数,排序后序号为偶数的数的个数即可(原偶现奇的个数与其相同)
#include <bits/stdc++.h> using namespace std; int n,dat[100005],id[100005]; bool cmp(int a,int b) {return dat[a]<dat[b];} int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&dat[i]),id[i]=i; sort(id+1,id+n+1,cmp); int res=0; for(int i=1;i<=n;i++) if((id[i]&1)&&!(i&1)) res++; printf("%d",res); return 0; }