A Clam and Fish
思路:
1.考虑在每个阶段所应该采取的操作。
2.在类型2与3时,直接抓鱼永远是最佳选择。但是在类型0时,只能通过鱼饵抓鱼;
3.类型1时,可以换鱼饵或者用鱼饵抓鱼。 所以,我们先忽视前导0,在3或4时答案加1。
4.后面遇到一个0,就尽可能使用鱼饵;遇到1,就先默认制作鱼饵,将现在拥有的鱼饵数量加1。
5.最后如果有剩余鱼饵,则可以用2次类型1的多余阶段来再抓一条鱼(一次换鱼饵,一次抓鱼)。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin >> n;
while (n--)
{
int t, num = 0, b = 0;
char a[2000001];
cin >> t;
for (int i = 0; i < t; i++)
{
cin >> a[i];
if (b > 0 && a[i] == '0')
{
num++;
b--;
}
if (a[i] == '2' || a[i] == '3')
num++;
if (a[i] == '1')
b++;
}
num += b / 2;
cout << num << endl;
}
return 0;
}
B Classical String Problem
思路:
把字符串当成一个环,这样无论是左移还是右移,某字符的位置是不变的
#include <bits/stdc++.h>
using namespace std;
char s[2000010];
int main()
{
scanf("%s", s);
int n, t = 0;
int length = strlen(s);
scanf("%d", &n);
while (n--)
{
char b;
int x;
scanf(" %c%d", &b, &x);
if (b == 'A')
{
x--;
printf("%c\n", s[(t + x) % length]);
}
else
{
if (x > 0)
{
t = x + t;
}
else
{
t = (t + length - abs(x)) % length;
}
}
}
}
C Operation Love
思路:
暴力判边,记录右手掌的每一条边,求出给出点的每一条边,然后暴力比较即可,注意有个坑点就是如果左手掌逆时针输入的话边的长度就和顺时针的右手掌一样,所以也要计算一遍叉积,详见代码。
#include <bits/stdc++.h>
using namespace std;
const double eps=1e-5;
struct point{
double x,y;
}p1[20],p2[20],p3[20];
double e1[20],e2[20],e3[20];
double Distance(point p1,point p2){
return (sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)));
}
double cross(point a,point b,point c){
return (a.x-c.x)*(b.y-c.y)-(a.y-c.y)*(b.x-c.x);
}
bool judge(){
for(int i=0;i<20;i++){//与右手掌的顺时针边比较
int flag=0;
for(int j=0;j<20;j++){
if(fabs(e2[(j+i)%20]-e1[j])<eps) flag++;
}
if(flag==20){
if(cross(p1[19],p1[1],p1[0])*cross(p2[i-1<0?19:i-1],p2[(i+1)%20],p2[i])>0) return 1;
}
}
for(int i=0;i<20;i++){与右手掌的逆时针边比较
int flag=0;
for(int j=0;j<20;j++){
if(fabs(e3[(j+i)%20]-e1[j])<eps) flag++;
}
if(flag==20){
if(cross(p1[19],p1[1],p1[0])*cross(p3[i-1<0?19:i-1],p3[(i+1)%20],p3[i])>0) return 1;
}
}
return 0;
}
int main(){
p2[0].x=1.000000,p2[0].y=0.000000;
p2[1].x=10.000000,p2[1].y=0.000000;
p2[2].x=10.000000,p2[2].y=8.000000;
p2[3].x=9.000000,p2[3].y=8.000000;
p2[4].x=9.000000,p2[4].y=5.000000;
p2[5].x=8.000000,p2[5].y=5.000000;
p2[6].x=8.000000,p2[6].y=10.000000;
p2[7].x=7.000000,p2[7].y=10.000000;
p2[8].x=7.000000,p2[8].y=5.000000;
p2[9].x=6.000000,p2[9].y=5.000000;
p2[10].x=6.000000,p2[10].y=10.000000;
p2[11].x=5.000000,p2[11].y=10.000000;
p2[12].x=5.000000,p2[12].y=5.000000;
p2[13].x=4.000000,p2[13].y=5.000000;
p2[14].x=4.000000,p2[14].y=10.000000;
p2[15].x=3.000000,p2[15].y=10.000000;
p2[16].x=3.000000,p2[16].y=3.000000;
p2[17].x=2.000000,p2[17].y=3.000000;
p2[18].x=2.000000,p2[18].y=6.000000;
p2[19].x=1.000000,p2[19].y=6.000000;
for(int i=0;i<20;i++){
e2[i]=Distance(p2[i],p2[(i+1)%20]);
if(i==0) p3[i]=p2[i];
else p3[i]=p2[20-i];
}
for (int i=0;i<20;i++) e3[i]=Distance(p3[i],p3[(i+1)%20]);//记录右手掌的逆时针边
int t;
scanf("%d",&t);
while(t--){
for(int i=0;i<20;i++) scanf("%lf%lf",&p1[i].x,&p1[i].y);
for(int i=0;i<20;i++) e1[i]=Distance(p1[i],p1[(i+1)%20]);
if(judge()) printf("right\n");
else printf("left\n");
}
return 0;
}