2 条题解
-
1
题意
有n个人编号从 到 。给你一个数组 , 代表第 个人的实力为 ,实力较强的人可以在比赛中胜出。现在让这些人按顺序从 编号 到 依次进行比赛,上一次比赛中胜出的人继续和下一个人比赛。现在假设你是第 个人,你可以选择一个人交换你们两个比赛的顺序(也可以不选),你想让你获胜的场次尽可能的多,问你交换完成后你获胜的场次最多是多少。
思路
此题在本场比赛中较难
其实就是要每场比赛都要下一个人与上一场的获胜者进行比赛,如果第 个人前面有比他大的,则当前方案胜场为 。所以我们要让第k个人尽量靠前或将比k大的第一个人向后移,即求出第k个人和第一个人交换和第k个人和第一个比它大的人交换的方案取最大即可。
尤其注意代码中的细节处理!!!
代码
C语言
#include<stdio.h> int a[100005],a1[100005]; int max(int a,int b) { if(a>b)return a; else return b; } void solve() { int n,k; scanf("%d%d",&n,&k); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); a1[i]=a[i]; } int s=a[k],r=n; for(int i=1;i<=n;i++) { if(a[i]>s) { r=i; break; } } int ans1=0; int tt=a[k]; a[k]=a[1]; a[1]=tt; for(int i=2;i<=n;i++) { if(a[i]<=s)ans1++; else break; } int ans2=0; int tt1=a1[k]; a1[k]=a1[r]; a1[r]=tt1; if(r<k) { for(int i=r+1;i<=n;i++) { if(a1[i]<=s)ans2++; else break; } if(r!=1)ans2++; } int ans=max(ans1,ans2); printf("%d\n",ans); } int main() { int t; scanf("%d",&t); while(t--) { solve(); } return 0; }
C++
#include<iostream> #include<algorithm> using namespace std; int a[100005],a1[100005]; void solve() { int n,k; cin >> n >> k; for(int i=1;i<=n;i++) { cin >> a[i]; a1[i]=a[i]; } int s=a[k],r=n; for(int i=1;i<=n;i++) { if(a[i]>s) { r=i; break; } } int ans1=0; swap(a[1],a[k]);//c++中的交换函数,交换a[1]和a[k]的值。 for(int i=2;i<=n;i++) { if(a[i]<=s)ans1++; else break; } int ans2=0; swap(a1[r],a1[k]); if(r<k) { for(int i=r+1;i<=n;i++) { if(a1[i]<=s) { ans2++; } else break; } if(r!=1)ans2++; } int ans=max(ans1,ans2); cout << ans <<endl; } int main() { int t; cin >> t; while(t--) { solve(); } return 0; }
信息
- ID
- 1032
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 59
- 已通过
- 10
- 上传者