2 条题解
-
1
想到要放在前面,也想到,和他之前的第一个大于他的数交换位置,但是我多想了想着交换情况是不是和那个数后面的大小也有关,也没有同时计数的思想,就想着直接输出结果,直接通向正确答案。受教了。
#include<stdio.h> int main(){ int n; scanf("%d",&n); while(n--) { int a,b; scanf("%d%d",&a,&b); int arr[a+9]={0}; for(int i=1;i<=a;i++) { scanf("%d",&arr[i]); } int y=1; for(int i=1;i<b;i++) { if(arr[i]>arr[b]) { y=i; break; } } int q1=0,q2=0; int w=arr[b]; arr[b]=arr[1]; arr[1]=w; int max=-111; for(int i=1;i<=a;i++) { if(arr[i]>max) { max=arr[i]; } if(arr[1]==max) { q1++; } } q1--; arr[1]=arr[b]; arr[b]=w; int e=arr[b]; arr[b]=arr[y]; arr[y]=e; max=-1111; for(int i=1;i<=a;i++) { if(arr[i]>max) { max=arr[i]; } if(arr[y]max) { q2++; } } if(y1) { q2--; } if(q1>q2) { printf("%d\n",q1); } else { printf("%d\n",q2); }
} return 0; }
-
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; }
- 1
信息
- ID
- 1032
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 59
- 已通过
- 10
- 上传者