Living-Dream 系列笔记 第26期

Posted on 2024-03-03 18:36  _XOFqwq  阅读(3)  评论(0编辑  收藏  举报

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;
}