吐槽
奇特的A题速度,第1个小时A了4道,之后花2个小时A了1道,然后就没有了(:з」∠)
莫名其妙的被拍了很多照片,好烦啊(•́へ•́╬)
这里就放一下我之前A掉的和之后订正出来的题吧╮(╯▽╰)╭
T1-Little Sub and Applese
读入字符串,把末尾的句号改成逗号。注意多组数据。
解法
标准签到题,不说了qwq
ac代码
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
char s[1000000];
int main()
{
while(gets(s))
{
if(s[strlen(s)-1]=='.')s[strlen(s)-1]='!';
printf("%s\n",s);
}
return 0;
}
T2-Little Sub and Balloons
问数列里有多少个不同的数字
解法
解法有很多,因为n很小,就100
所以压进map,丢进set,要是愿意,写个hash也可以,都能过
ac代码
#include<cstring>
#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
int n,x,res;
map<int,int>mp;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
if(!mp[x])res++;
mp[x]=1;
}
printf("%d",res);
return 0;
}
T3-Little Sub and Apples
n个苹果,吃k天,每天吃min(t,rest)个苹果。
解法
这也是标准的签到题,式子就是max(0,n-k*t),注意要开long long
ac代码
#include<cstring>
#include<cstdio>
#include<iostream>
#include<map>
using namespace std;
long long n,k,t;
int main()
{
scanf("%lld%lld%lld",&n,&k,&t);
printf("%lld",max(1ll*0,n-k*t));
return 0;
}
T4-Little Sub and Triples
问区间里有没有三个数能组成三角形的边长
解法
这道题考试的时候想不出来,n和q都有20w,结果正解是暴力???
最暴力的就是每个区间排序后判断相邻的3个能否组成三角形
怎么优化呢,想一下,要构造一个不符合的区间,那就是一个斐波那契数列,到50多项就爆int了,所以如果区间长度大于60,肯定是可行的,对于60以下的,排序暴枚就好了
ac代码
#include<cstring>
#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int n,q,l,r;
long long a[200010],s[100];
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
for(int i=1;i<=q;i++)
{
scanf("%d%d",&l,&r);
if(l<1||r>n||(r-l+1)<3)
{
puts("NO");
continue;
}
if(r-l+1>60)
{
puts("YES");
continue;
}
for(int i=1;i<=(r-l+1);i++)
s[i]=a[i+l-1];
sort(s+1,s+1+r-l+1);
int flg=1;
for(int i=3;i<=(r-l+1);i++)
{
if(1ll*s[i-2]+1ll*s[i-1]>1ll*s[i])
{
flg=0;
break;
}
}
if(flg)puts("NO");
else puts("YES");
}
return 0;
}
T5-Little Sub and Enigma
26个小写字母有一组双射,求从读入的数据中能观察或推导出的关系。
解法
这道题很坑啊,一共有3条规则,前2条很容易推出来,就是不能一对多或者多对一,那推导是什么意思呢
如果推出了25组关系,那么第26组关系也随之确定emmm考场上智商不在线
ac代码
#include<cstring>
#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
char sa[1000010],sb[1000010];
int a[30],b[30],res,s;
int main()
{
gets(sa);
gets(sb);
int l=strlen(sa);
for(int i=0;i<l;i++)
{
int x=sa[i]-'a'+1;
int y=sb[i]-'a'+1;
if(a[x]!=y&&a[x]!=0)
{
puts("Impossible");
return 0;
}
if(b[y]!=x&&b[y]!=0)
{
puts("Impossible");
return 0;
}
a[x]=y;
b[y]=x;
}
for(int i=1;i<=26;i++)
{
if(a[i])res++;
if(!b[i])s=i;
}
for(int i=1;i<=26;i++)
{
if(a[i])printf("%c->%c\n",i+'a'-1,a[i]+'a'-1);
else if(res==25)printf("%c->%c\n",i+'a'-1,s+'a'-1);
}
return 0;
}
T6-Little Sub and Counting
问对每个x问x^y>y^x的y个数。
解法
题目的意思也就是给定一个序列,求对于每一个x而言满足上述条件的y有多少个,我们可以找规律
发现x=1时一定是0,x=2时是大于4的数的个数,x=3时是2的个数和大于3的数的个数
x为别的数时答案就是大于x的数的个数,这样就很好做了
ac代码
#include<cstring>
#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
struct p
{
int x,id;
}a[100010];
int n,ans[100010],cnt;
map<int,int>mp;
bool cmp(p xx,p yy)
{
return xx.x<yy.x;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i].x);
a[i].id=i;
mp[a[i].x]++;
}
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++)
{
if(a[i].x==1)ans[a[i].id]=0;
else if(a[i].x!=a[i-1].x)cnt+=mp[a[i].x],ans[a[i].id]=n-cnt;
else ans[a[i].id]=ans[a[i-1].id];
}
for(int i=1;i<=n;i++)
if(a[i].x==2)ans[a[i].id]-=mp[3]+mp[4];
else if(a[i].x==3)ans[a[i].id]+=mp[2];
for(int i=1;i<=n;i++)printf("%d ",ans[i]);
return 0;
}
T7-Little Sub and Triangles
问面积为[l,r]的三角形个数
解法
题意就是给定一堆点,然后可以组成很多三角形,对于每个区间[l,r]询问面积在区间内三角形的个数
对于在同一条直线上的点,算一个面积为0的三角形
这道题可以预处理出所有的面积,排个序,二分就好了,唯一的坑是计算面积时的精度损失
由于都是整点,所以能证明出面积的最小分度是0.5,所以二分时加一个0.01就可以了
ac代码
#include<cstring>
#include<cstdio>
#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
using namespace std;
int n,q,cnt;
double x[300],y[300],s[4000000],l,r;
double f(int a,int b)
{
return sqrt(abs(x[a]-x[b])*abs(x[a]-x[b])+abs(y[a]-y[b])*abs(y[a]-y[b]));
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%lf%lf",&x[i],&y[i]);
for(int i=1;i<=n;i++)
for(int j=i+1;j<=n;j++)
for(int k=j+1;k<=n;k++)
{
double a=f(i,j),b=f(i,k),c=f(j,k);
s[++cnt]=sqrt(abs(a+b+c)/2.0)*sqrt(abs(a+b-c)/2.0)*sqrt(abs(a-b+c)/2.0)*sqrt(abs(-a+b+c)/2.0);
}
sort(s+1,s+1+cnt);
for(int i=1;i<=q;i++)
{
scanf("%lf%lf",&l,&r);
int ll=lower_bound(s+1,s+1+cnt,l-0.01)-s,rr=upper_bound(s+1,s+1+cnt,r+0.01)-s;
printf("%d\n",rr-ll);
}
return 0;
}