版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/albertluf/article/details/82313142
题目:链接
A - Balloon Robot
设机器人从0位置出发, 对于每一个a[i],b[i]算出b[i]时间机器人与s[a[i]]的距离,即所需等待时间,
此时如果将机器人位置向前推进1,则它越过的t[i]时间都会加上m,因为要相遇就要多走一圈,
然后所有的等待时间-1。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=1e5+10;
int s[maxn],t[maxn];
int main()
{
int T;scanf("%d",&T);
while(T--)
{
int n,m,p;scanf("%d%d%d",&n,&m,&p);
for(int i=1;i<=n;i++)
{
scanf("%d",&s[i]);
s[i]--;
}
ll ans=0,cnt=0;
for(int i=1;i<=p;i++)
{
int a,b;scanf("%d%d",&a,&b);
b%=m;
if(b<=s[a]) t[i]=s[a]-b;
else t[i]=m-(b-s[a]);
ans+=t[i];
}
cnt=ans;
sort(t+1,t+p+1);
for(int i=1;i<=p;i++)
ans=min(ans,cnt-1LL*t[i]*p+1LL*(i-1)*m);
printf("%lld\n",ans);
}
return 0;
}
C - Crusaders Quest
模拟即可:
#include<bits/stdc++.h>
using namespace std;
char t[15];
int num[200],vis[200];
int main()
{
int T;scanf("%d",&T);
while(T--)
{
scanf("%s",t+1);
int len=0,a[4];
int ans=0,k=-1;
for(int i=1;i<=9;i++)
if(t[i]=='a') a[len++]=i;
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans++,k=1;
len=0;
for(int i=1;i<=9;i++)
if(t[i]=='g') a[len++]=i;
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans++,k=2;
len=0;
for(int i=1;i<=9;i++)
if(t[i]=='o') a[len++]=i;
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans++,k=3;
if(ans>=2) printf("3\n");
else if(ans==1)
{
//cout<<k<<endl;
ans=2;
if(k==1)
{
int id=1,len=0;
for(int i=1;i<=9;i++)
{
if(t[i]=='a') continue;
if(t[i]=='g') a[len++]=id;
id++;
}
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans++;
id=1,len=0;
for(int i=1;i<=9;i++)
{
if(t[i]=='a') continue;
if(t[i]=='o') a[len++]=id;
id++;
}
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans++;
}
if(k==2)
{
int id=1,len=0;
for(int i=1;i<=9;i++)
{
if(t[i]=='g') continue;
if(t[i]=='a') a[len++]=id;
id++;
}
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans++;
id=1,len=0;
for(int i=1;i<=9;i++)
{
if(t[i]=='g') continue;
if(t[i]=='o') a[len++]=id;
id++;
}
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans++;
}
if(k==3)
{
int id=1,len=0;
for(int i=1;i<=9;i++)
{
if(t[i]=='o') continue;
if(t[i]=='g') a[len++]=id;
id++;
}
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans++;
id=1,len=0;
for(int i=1;i<=9;i++)
{
if(t[i]=='o') continue;
if(t[i]=='a') a[len++]=id;
id++;
}
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans++;
}
printf("%d\n",min(3,ans));
}
else
{
ans=1;
int id=1;len=0;
for(int i=1;i<=9;i++)
{
if(t[i]=='a') continue;
if(t[i]=='g') a[len++]=id;
id++;
}
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans=2;
id=1;len=0;
for(int i=1;i<=9;i++)
{
if(t[i]=='a') continue;
if(t[i]=='o') a[len++]=id;
id++;
}
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans=2;
id=1;len=0;
for(int i=1;i<=9;i++)
{
if(t[i]=='g') continue;
if(t[i]=='a') a[len++]=id;
id++;
}
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans=2;
id=1;len=0;
for(int i=1;i<=9;i++)
{
if(t[i]=='g') continue;
if(t[i]=='o') a[len++]=id;
id++;
}
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans=2;
id=1;len=0;
for(int i=1;i<=9;i++)
{
if(t[i]=='o') continue;
if(t[i]=='g') a[len++]=id;
id++;
}
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans=2;
id=1;len=0;
for(int i=1;i<=9;i++)
{
if(t[i]=='o') continue;
if(t[i]=='a') a[len++]=id;
id++;
}
if(a[0]+1==a[1]&&a[1]+1==a[2]) ans=2;
printf("%d\n",ans);
}
}
return 0;
}
E - String of CCPC
每加一个字符最多增加一个CCPC,因此至多添加一个字符,特判几种情况即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
char t[maxn];
int main()
{
int T;scanf("%d",&T);
while(T--)
{
int bb=0;
int n;scanf("%d",&n);
scanf("%s",t+1);
t[0]=t[n+1]=t[n+2]=t[n+3]=t[n+4]=t[n+5]=t[n+6]='#';
int ans=0;
for(int i=4;i<=n;i++)
if(t[i-3]=='C'&&t[i-2]=='C'&&t[i-1]=='P'&&t[i]=='C') ans++;
for(int i=3;i<=n;i++)
{
if(t[i]=='C'&&t[i-1]=='P'&&t[i-2]=='C'&&t[i-3]!='C')
bb=1;
if(t[i]=='P'&&t[i-1]=='C'&&t[i-2]=='C'&&t[i+1]!='C')
bb=1;
if(t[i]=='C'&&t[i-1]=='C'&&t[i-2]=='C'&&(t[i+1]!='P'||t[i+2]!='C'))
bb=1;
}
printf("%d\n",ans+bb);
}
return 0;
}
只有两种选择,把m右边的改为R,或把m左边的改为L.
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
char t[maxn];
int main()
{
int T;scanf("%d",&T);
while(T--)
{
int n,m;scanf("%d%d",&n,&m);
scanf("%s",t+1);
int ans1=0,ans2=0;
for(int i=2;i<m;i++)
if(t[i]=='R') ans1++;
for(int i=m+1;i<n;i++)
if(t[i]=='L') ans2++;
if(t[m]=='L') ans2++;
else ans1++;
printf("%d\n",min(ans1,ans2));
}
return 0;
}
M - Safest Buildings
小圆必须包含在大圆内,因此小圆的圆心有一个范围,小圆的圆心构成的集合也是一个圆。记为O,
对于每个点,以此点为圆心,以r为半径构成的圆与圆O重合的面积除以圆O的面积就是概率。
此处无需求相交面积,只要sqrt(a*a+b*b)<=abs(R-2*r) 概率一定是最大,否则只需比较a*a+b*b即可。
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
int x[maxn],y[maxn];
int ans[maxn];
int main()
{
int T;scanf("%d",&T);
while(T--)
{
int n,R,r;scanf("%d%d%d",&n,&R,&r);
for(int i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]);
for(int i=1;i<=n;i++)
{
if(R>=2*r&&x[i]*x[i]+y[i]*y[i]<=(R-2*r)*(R-2*r))
ans[i]=0;
else if(R<2*r&&x[i]*x[i]+y[i]*y[i]<=(2*r-R)*(2*r-R))
ans[i]=0;
else
ans[i]=x[i]*x[i]+y[i]*y[i];
}
//for(int i=1;i<=n;i++) cout<<ans[i]<<" ";
//cout<<endl;
int mi=1e9,cnt=0;
for(int i=1;i<=n;i++)
{
if(ans[i]<mi) mi=ans[i],cnt=1;
else if(mi==ans[i]) cnt++;
}
printf("%d\n",cnt);
bool bb=0;
for(int i=1;i<=n;i++)
{
if(ans[i]!=mi) continue;
if(bb) printf(" ");
printf("%d",i);
bb=1;
}
printf("\n");
}
return 0;
}