Problem
T1
见题解。
T2
/*
思路:
枚举每一头牛说的话,尝试将Bessie置于pi处,
再枚举其他牛说的话,检验不合法的数量,取max即为答案。
*/
#include<bits/stdc++.h>
using namespace std;
int n,ans=1e9;
struct node{
char op;
int p;
}a[1031];
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].op>>a[i].p;
for(int i=1;i<=n;i++){
int sum=0;
for(int j=1;j<=n;j++){
if(a[j].op=='G'&&a[j].p>a[i].p) sum++;
if(a[j].op=='L'&&a[j].p<a[i].p) sum++;
}
ans=min(ans,sum);
}
cout<<(ans==1e9?0:ans);
return 0;
}
T3
/*
思路:
枚举9个数的全排列,
然后枚举三段区间,分别代表整数、分子和分母,
若整数+分子/分母=n,则说明当前排列是合法的,将答案累加。
*/
#include<bits/stdc++.h>
using namespace std;
int n,ans;
int tmp[9]={1,2,3,4,5,6,7,8,9};
bool check(){
for(int i=0;i<9;i++)
for(int j=i+1;j<9;j++){
int s1=0,s2=0,s3=0;
double s=0.0;
for(int k=0;k<=i;k++) s1=s1*10+tmp[k];
for(int k=i+1;k<=j;k++) s2=s2*10+tmp[k];
for(int k=j+1;k<9;k++) s3=s3*10+tmp[k];
s=(double)s1+(double)s2/(double)s3;
if(s==n) return 1;
}
return 0;
}
int main(){
cin>>n;
do{
if(check()) ans++;
}while(next_permutation(tmp,tmp+9));
cout<<ans;
return 0;
}
T4
/*
思路:
考虑二分R的值,
在check函数中,对n垛干草排序并遍历,
记录数组vis表示不用炸弹的位置,
若当前干草的vis=1,则不用放置炸弹,直接跳过,
否则在当前位置+R处放置一个炸弹,
并将从当前位置开始的到2R处的所有干草的vis均标记为1。
*/
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline __int128 read() {
__int128 x = 0, f = 1; char ch = getchar();
while (ch > '9' || ch < '0') { if (ch == '-')f = -1; ch = getchar(); }
while (ch >= '0' && ch <= '9') { x = x * 10 + ch - '0'; ch = getchar(); }
return x * f;
}
inline void write(__int128 x) {
if (x < 0) { putchar('-'); x = -x; }
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
int n,k,maxn=-1e9,a[50031];
bool vis[50031];
bool check(int x){
int sum=0;
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++){
if(vis[i]) continue;
sum++;
for(int j=i;j<=n;j++){
if(a[i]+2*x<a[j]) break;
vis[j]=1;
}
}
return sum<=k;
}
signed main(){
ios::sync_with_stdio(0);
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i],maxn=max(maxn,a[i]);
sort(a+1,a+n+1);
int l=0,r=maxn+1;
while(l+1<r){
int mid=(l+r)>>1;
if(check(mid)) r=mid;
else l=mid;
}
cout<<r;
return 0;
}