題目大意:
給出一個數組,找每個位置的與序列裏的其他值的差的絕對值最大值與最小值。
解題思路:
記錄位置並排序,最大值肯定與排序後的頭元素或尾元素的差,最小值肯定是排序後的位置的前一個元素或者後一個元素。
代碼:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=200000+1000;
struct node
{
int x;
int cur;
}a[maxn];
int b[maxn];
int c[maxn];
bool cmp(node u,node v)
{
return u.x<v.x;
}
int bbs(int x)
{
if(x<0)
return -x;
return x;
}
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i].x);
a[i].cur=i;
}
sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
if(i==0)
b[a[i].cur]=a[i+1].x-a[i].x;
else if(i==n-1)
b[a[i].cur]=a[n-1].x-a[i-1].x;
else
b[a[i].cur]=min(bbs(a[i-1].x-a[i].x),bbs(a[i+1].x-a[i].x));
c[a[i].cur]=max(bbs(a[0].x-a[i].x),bbs(a[n-1].x-a[i].x));
}
for(int i=0;i<n;i++)
printf("%d %d\n",b[i],c[i]);
}
return 0;
}
題目大意:
給出進出日誌,求房間的最小容量。
解題思路:
房間的容量取決於房間最多人的時候。
代碼:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
#include <algorithm>
using namespace std;
const int maxn=1000000+100;
int a[maxn];
int c[maxn];
int main()
{
char s[15];
int n;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
int d;
int ans=0,cur=0;
int sign=0;
for(int i=0;i<n;i++)
{
scanf("%s%d",s,&d);
if(s[0]=='+')
{
sign++;
a[d]=1;
c[i]=sign;
}
else
{
if(a[d]==1)
{
sign--;
a[d]=0;
c[i]=sign;
}
else
{
c[i]=c[i-1]+1;
for(int j=i-1;j>=0;j--)
c[j]++;
}
}
}
for(int i=0;i<n;i++)
{
ans=max(ans,c[i]);
}
cout<<ans<<endl;
}
return 0;
}
題目大意:
給出一段序列,求序列裏的3個數成等比數列,且比值爲k的數量。
解題思路:
配句中間那個元素,前面那個元素和後面那個元素出現的次數相乘就可。
代碼:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
map<long long,int> ma;
map<long long,int> ma2;
long long a[210000];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
for(int i=0; i<n; i++)
{
cin>>a[i];
}
ma.clear(),ma2.clear();
for(int i=n-1; i>=0; i--)
{
ma[a[i]]++;
}
long long ans=0;
for(int i=0; i<n; i++)
{
ma[a[i]]--;
long long cur=0;
if(ma[a[i]*k])
{
cur=ma[a[i]*k];
if(a[i]%k==0)
{
if(ma2[a[i]/k])
{
cur=cur*ma2[a[i]/k];
//cout<<cur<<" "<<ma2[a[i]/k]<<" "<<a[i]/k<<endl;
}
else
cur=0;
}
else
cur=0;
}
ma2[a[i]]++;
ans+=cur;
//cout<<cur<<endl;
}
cout<<ans<<endl;
return 0;
}
題目大意:
n個1*1的小格子,k個1*a的小船,要將k個小船放進n個格子內,不能相鄰,接着m個操作,每次讓第xi個格子不能用,求第幾個操作後船就放不下了。
解題思路:
每次操作,只會講1段區間分成2段,只需求分開前後少放了幾個小船。
代碼:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <set>
using namespace std;
set<int> s;
int main()
{
int n,k,a;
scanf("%d%d%d",&n,&k,&a);
int m,x;
scanf("%d",&m);
s.insert(0);
s.insert(n+1);
int ans=-1;
int cur=1+(n-a)/(a+1),x1,x2;
//cout<<cur<<endl;
if(cur<k)
{
ans=0;
}
for(int i=0;i<m;i++)
{
scanf("%d",&x);
if(ans!=-1)
continue;
int temp=*(--s.upper_bound(x));
int tempd=*(s.upper_bound(x));
s.insert(x);
//cout<<temp<<" "<<tempd<<endl;
x1=0,x2=0;
if(tempd-temp-1>=a)
x1=1+(tempd-temp-1-a)/(a+1);
if(x-temp-1>=a)
x2=1+(x-temp-1-a)/(a+1);
if(tempd-x-1>=a)
x2+=(1+(tempd-x-1-a)/(a+1));
//cout<<x1<<" "<<x2<<endl;
cur-=(x1-x2);
if(cur<k)
{
ans=i+1;
}
}
cout<<ans<<endl;
return 0;
}