2020.10.30【CSP-J/S】普及组模拟赛总结

题号 题目
T1 平面上的直线
T2 有趣的水管
T3 小C的作业题
T4 租车去春游
T5 排数字
得分 185/205

T1

思路

未做出。

T2

思路

本题是一个二分,可以做到 O ( log ⁡ 2 k ) O(\log_2{k}) O(log2k).
我们可以从 k = 1 k=1 k=1 的情况开始推式子。
  1 ☞ k − 1 ~1☞k-1  1k1 二分一个 m i d mid mid, 由等差数列求和公式可得 m i d mid mid 的贡献是:
( m i d ∗ k ) − ( m i d − 1 ) − ( m i d − 1 ) ∗ m i d 2 (mid*k)-(mid-1)-\frac{(mid-1)*mid}{2} (midk)(mid1)2(mid1)mid
对于 > = n >=n >=n 的情况维护答案即可。

代码:

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
long long n,k,js,ans=-1; 
int main()
{
    
    
	cin>>n>>k;
	if(n==1)
	 {
    
    
	 	cout<<0;
	 	return 0;
	 }
	if(n<=k)
	 {
    
    
	 	cout<<1;
	 	return 0;
	 }
	long long l=1,r=k-1,mid=0;
	while(l<=r)
	 {
    
    
	 	mid=(l+r)/2;
	 	js=(mid*k)-(mid-1)-(mid-1)*mid/2;
	 	if(js>=n)
	 	  r=mid-1,ans=mid;
	 	else
	 	  l=mid+1;
	 }
	cout<<ans;
	return 0;
}

T3

思路

未做出。

T4

思路

未做出

T5

思路

博弈论,取每行的次大中的最大。
具体思路请看 luogu P1199 三国游戏第一篇题解

代码

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,a[1010][1010],ans;
int main()
{
    
    
	cin>>n;
	for(int i=1; i<n; i++)
	 for(int j=i+1; j<=n; j++)
	  	cin>>a[i][j],a[j][i]=a[i][j];
	for(int i=1; i<=n; i++)
	  {
    
    
	    sort(a[i]+1,a[i]+1+n);
	    ans=max(ans,a[i][n-1]);
	  }
	cout<<1<<endl<<ans;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/Jackma_mayichao/article/details/109386924
今日推荐