简单模拟选做

HelloWorld! / 2024-04-18 / 原文

海港

重点在于想到我们不关心每个人是第几批次,不关心同一时间同一国籍有几个人,所以可以只储存去重后的每个人的国籍和时间信息。

使用queue和map和pair,stl就是好用(

#include<iostream>
#include<cstdio>
#include<queue>
#include<map>

using namespace std;

const int N=200000;
int n,t[N];
queue<pair<int,int>>q,p;

int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i){
		int k;scanf("%d%d",&t[i],&k);
		map<int,int>m;
		for(int j=1;j<=k;++j){
			int x;scanf("%d",&x);
			if(m[x]) continue;
			m[x]=1;
			q.push(make_pair(t[i],x));
		}
	}
	map<int,int>m1;
	for(int i=1;i<=n;++i){
		while(p.front().first<=t[i]-86400&&!p.empty()){
			if(--m1[p.front().second]==0) m1.erase(p.front().second);
			p.pop();
		}
		while(q.front().first<=t[i]&&!q.empty()){
			++m1[q.front().second];
			p.push(q.front());q.pop();
		}
		printf("%d\n",m1.size());
	}
	return 0;
}

Home

题意:给定序列\(a_n\)和常数\(p\),求

\[\Sigma^{n}_{i=1}(2|x-a_i|+px) \]

的最小值

解法:三分法求单峰函数极值,略卡常

#include<iostream>
#include<cstdio>
#include<cmath>

#define ll long long
using namespace std;

const int N=1000010;
int n,p;
int a[N];

inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}

inline ll cal(ll x){
	ll ans=p*x;
	for(int i=1;i<=n;++i){
		ans+=abs(a[i]-x)*2;
	}
	return ans;
}

inline int tri(int l,int r){
	if(l==r) return l;
	if(r-l==1){
		ll cl=cal(l),cr=cal(r);
		if(cl<=cr) return l;
		return r;
	}
	if(r-l==2){
		ll c1=cal(l),c2=cal((l+r)/2),c3=cal(r);
		if(c1<=c2&&c1<=c3) return l;
		if(c2<=c3) return (l+r)/2;
		return r;
	}
	int m1=l+(r-l)/3,m2=r-(r-l)/3;
	ll c1=cal(m1),c2=cal(m2);
	if(c1>c2) return tri(m1,r);
	return tri(l,m2);
}

int main(){
	int T;T=read();while(T--){
//		scanf("%d%d",&n,&p);
		n=read();p=read();
		int l=N,r=-N;
		for(int i=1;i<=n;++i){
//			scanf("%d",&a[i]);
			a[i]=read();
			l=min(l,a[i]);r=max(r,a[i]);
		}
		if(abs(p)>n*2) {printf("No\n");continue;}
		if(abs(p)==n*2&&p>0) {printf("No\n");continue;}
		int ans=tri(l,r);
		printf("%d\n",ans);
	}
	return 0;
}

计算器的改良

注意一点细节:a+2a=4这个式子a默认系数是1;-2x=0解出来会x=-0.000,需要特判。。。

#define eps 0.000006
int main(){
	char n,x;int a=0,b=0,c=0,d=0,flag=0,tmp=0,minus=1;double ans;
	while(n=getchar()){
		if(n>='0'&&n<='9') tmp=tmp*10+n-'0';
		else{
			tmp*=minus;
			if(n>='a'&&n<='z'){
				x=n;
				if(tmp==0) tmp=1;
				if(flag) c+=tmp;
				else a+=tmp;
			}else{
				if(flag) d+=tmp;
				else b+=tmp;
			}tmp=0;minus=1;
			if(n=='=') flag=1;
			if(n=='-') minus=-1;
		}
		if(n=='\n') break;
	} ans=1.0*(d-b)/(a-c);
	if(fabs(ans)<eps) ans=0.0;
	printf("%c=%.3lf",x,ans);
	return 0;
}