简单模拟选做
海港
重点在于想到我们不关心每个人是第几批次,不关心同一时间同一国籍有几个人,所以可以只储存去重后的每个人的国籍和时间信息。
使用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;
}