P1007. 独木桥
当两人面对面相碰时,两人都会转向行走, 那可以看成两个人交错而过。
求最小时间,计算出每个人到达两边的最小时间,所有时间中最大的一个即为所有人离开桥需要用的时间。
求最大时间,计算出每个人到达两边的最大时间,所有时间中最大的一个即为所有人离开桥需要用的时间。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int l,n,a[5003];
cin>>l>>n;
for (int i=1;i<=n;i++)
cin>>a[i];
// sort(a+1,a+n+1);
int x=int(l/2.0+0.5);
int ans1=0,ans2=0;
for (int i=1;i<=n;i++)
ans1=max(min(a[i],l+1-a[i]),ans1);
for (int i=1;i<=n;i++)
ans2=max(max(a[i],l+1-a[i]),ans2);
cout<<ans1<<" "<<ans2<<endl;
return 0;
}
P1031. [NOIP2002 提高组] 均分纸牌
统计纸牌总数,计算平均数,即为每个纸牌堆的最终纸牌数。
从左往右遍历,如果当前纸牌堆不等于平均数,则将其与平均数的差累加的右侧的纸牌队:如果当前纸牌数大于平均数,则相当于把多出来纸牌放置到右侧;如果当前纸牌数小于平均数,则相等于从右侧索取纸牌。操作完成后增加一个操作计数。单次操作后当前纸牌堆的数量将会变成平均数,结束后所有的纸牌都将变成平均数。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[10001];
long long avg=0;
int n;
cin>>n;
for (int i=1;i<=n;i++)
{
cin>>a[i];
avg+=a[i];
}
avg/=n;
int ans=0,x=0;
for (int i=1;i<=n;i++)
{
if (a[i]!=avg)
{
a[i+1]=a[i+1]+a[i]-avg;
ans++;
}
}
cout<<ans<<endl;
return 0;
}
P2695. 骑士的工作
将头的大小和$z_i$都进行从小到大的排序,判断当前的$z_i$是否大于当前的头,大于的话计入金币,两个数组指针同时向后移动。否者$z$指针向后移动。
程序中使用小根堆实现排序。
int n,m;
int x;
priority_queue<int,vector<int>,greater<int> > q1;
priority_queue<int,vector<int>,greater<int> > q2;
int main()
{
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
CI n>>m;
F(i,1,n)
{
CI x;
q1.push(x);
}
F(i,1,m)
{
CI x;
q2.push(x);
}
LL ans=0;
while (!q1.empty() && !q2.empty())
{
if (q1.top()<=q2.top())
{
q1.pop();
ans+=q2.top();
q2.pop();
}
else
{
q2.pop();
}
}
if (!q1.empty())
{
CO "you died!" L;
return 0;
}
else CO ans L;
return 0;
}
P5639. 【CSGRound2】守序者的尊严
将连续的0或连续的1看成一块,数一共有多少块即可。
int n,x,y,ans;
int main()
{
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
CI n;
CI x;
ans=1;
F(i,2,n)
{
CI x;
if (x!=y)
{
ans++;
y=x;
}
}
CO ans L;
return 0;
}
P1056. [NOIP2008 普及组] 排座椅
先统计每一行和每一列一共有多少人会交头接耳,然后按数量从大到小排序,再从大到小记录前K、L个行列,最后按序输出即可。
int M,N,K,L,D;
int x,y,p,q;
map<int,int> k;
map<int,int> l;
pair<int,int> kk[1005];
pair<int,int> ll[1005];
int kkk[1005],lll[1005];
bool cmp(pair<int,int> a,pair<int,int> b)
{
return a.second>b.second;
}
int main()
{
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
CI M>>N>>K>>L>>D;
F(i,1,D)
{
CI x>>y>>p>>q;
if (x==p) l[min(y,q)]++;
elif (y==q) k[min(x,p)]++;
}
int indexl = 1;
for (auto i : l)
ll[indexl++]=i;
indexl--;
int indexk=1;
for (auto i:k)
kk[indexk++]=i;
indexk--;
sort(kk+1,kk+indexk+1,cmp);
sort(ll+1,ll+indexl+1,cmp);
F(i,1,K)
kkk[kk[i].first] = 1;
F(i,1,L)
lll[ll[i].first] = 1;
F(i,1,M)
if (kkk[i]) CO i P;
cout<<endl;
F(i,1,N)
if (lll[i]) CO i P;
cout<<endl;
return 0;
}
P1090. [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G
因为每次合并果子时都会导致最先合并的果子被重复计算一次,所以让最少的果子堆重复记录最多次,最多的果子堆记录最少次,即每次合并数量最少的两堆果子,然后将合并后的果子堆放回队列。
使用小根堆可以实现每次取出最小的两堆果子,插入新的果子堆可以自动排序。
int n,x,ans;
priority_queue<int,vector<int>,greater<int> > q;
int main()
{
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
CI n;
F(i,1,n)
{
CI x;
q.push(x);
}
F(i,1,n-1)
{
int a=q.top();
q.pop();
int b=q.top();
q.pop();
ans+=a+b;
q.push(a+b);
}
CO ans L;
return 0;
}
P1106. 删数问题
进行n次查找,每次查找都从头到尾遍历字符串然后找到第一个峰顶,删除后再消除前缀0。
int n;
int a[1000];
string s;
int k;
int main()
{
// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
CI s;
CI n;
F(i,1,n)
{
int j=0;
while (s[j]>=s[j-1]&&j<s.size())
j++;
s.erase(j-1,1);
while (s[0]=='0')
s.erase(0,1);
}
if (s.size()==0)
CO 0 L;
else
CO s L;
return 0;
}
P2630. 图像变换
手推可得,图像的变化只会有8种,A、B、C、D、AA、AB、AC、AD。所以只需要判断属于这8种的哪一个就可以了。
int a,b,c,d,e,f,g,h,i;
int A,B,C,D,E,F,G,H,I;
int main()
{
CI a>>b>>c>>d>>e>>f>>g>>h>>i;
CI A>>B>>C>>D>>E>>F>>G>>H>>I;
if (A==g&&B==d&&C==a&&D==h&&E==e&&F==b&&G==i&&H==f&&I==c) CO "A" L;
elif (A==c&&B==f&&C==i&&D==b&&E==e&&F==h&&G==a&&H==d&&I==g) CO "B" L;
elif (A==c&&B==b&&C==a&&D==f&&E==e&&F==d&&G==i&&H==h&&I==g) CO "C" L;
elif (A==g&&B==h&&C==i&&D==d&&E==e&&F==f&&G==a&&H==b&&I==c) CO "D" L;
elif (A==i&&B==h&&C==g&&D==f&&E==e&&F==d&&G==c&&H==b&&I==a) CO "AA" L;
elif (A==a&&B==b&&C==c&&D==d&&E==e&&F==f&&G==g&&H==h&&I==i) CO "AB" L;
elif (A==a&&B==d&&C==g&&D==b&&E==e&&F==h&&G==c&&H==f&&I==i) CO "AC" L;
elif (A==i&&B==f&&C==c&&D==h&&E==e&&F==b&&G==g&&H==d&&I==a) CO "AD" L;
else CO "Poland cannot into space!!!" L;
return 0;
}
P5514. [MtOI2019] 永夜的报应
a^b<=a+b,所以要让异或和最小,那就让所有数字异或在一起就可以了。
int n,ans,a;
int main()
{
CI n;
while (n--)
{
CI a;
ans^=a;
}
CO ans L;
return 0;
}
Comments | NOTHING