题号 | 题目 |
---|---|
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 1☞k−1 二分一个 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} (mid∗k)−(mid−1)−2(mid−1)∗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;
}