今日所学:模拟类型
1.if(flag)与if(flag==true)含义相同
2.G. [usaco2019jan bronze]shell 果壳游戏
#include<bits/stdc++.h>
using namespace std;
int n;
struct nut
{
int x;
int y;
int z;
}a[110000];
int main()
{
freopen("shell.in","r",stdin);
freopen("shell.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].x>>a[i].y>>a[i].z;
}
int maxn=-1;
int flag[10000]={0,0,0,0};
for(int i=1;i<=n;i++)
{
memset(flag,0,sizeof(flag));
int sum=0;
flag[i]=1;
for(int j=1;j<=n;j++)
{
swap(flag[a[j].x],flag[a[j].y]);
if(flag[(a[j].z)]==1) sum++;
if(maxn<sum) maxn=sum;
}
}
cout<<maxn;
return 0;
}
根据老师所讲,运用结构体输入和判断,但明显过于麻烦
所谓模拟,即按照题目意思,做出相应的代码
这里一定要注意bool flag与int flag的区别
bool类型只能返回1或者零
而int则返回整型,可以是-1,-2, 1, 2…
还有注意双重循环时一些语句是放在第一层还是第二层
3.黑色星期五
运用到日期转星期的公式,直接硬钢即可
int getweek(int y,int m,int d)
{
if(m==1)
{
y--;
m=13;
}
if(m==2)
{
y--;
m=14;
}
int w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;
if(w==0) w=7;
return w;
}
3.瑶馨相遇
void init1()
{
for(int i=1;i<=x;i++)
{
cin>>n>>str;
tool+=n;
if(str=='R')
{
for(int j=1;j<=n;j++)
{
id1++;
timen++;
a[timen]=id1;
}
}
if(str=='L')
{
for(int j=1;j<=n;j++)
{
id1--;
timen++;
a[timen]=id1;
}
}
}
}
void init2()
{
for(int i=1;i<=y;i++)
{
cin>>n>>str;
tooln+=n;
if(str=='R')
{
for(int j=1;j<=n;j++)
{
id2++;
time1++;
b[time1]=id2;
}
}
if(str=='L')
{
for(int j=1;j<=n;j++)
{
id2--;
time1++;
b[time1]=id2;
}
}
}
}
void print()
{
int maxn=max(tool,tooln);
if(maxn==tool)
{
//补全第二个
for(int i=tooln+1;i<=maxn;i++)
{
time1++;
b[time1]=id2;
}
}
else
{
//补全第一个
for(int i=tool+1;i<=maxn;i++)
{
timen++;
a[timen]=id1;
}
}
for(int i=1;i<=maxn;i++)
{
if(a[i]==b[i]&&a[i-1]!=b[i-1])
answer++;
}
cout<<answer;
}
总结坑点:
1,题目中点明为相遇,而不是追上,所以前一刻位置必须不同
2,计算时间
3,分别记录路程
4.字符串展开
主要是设计函数和字符串的灵活运用
例如:append,eraser,insert…
5.馨馨测量
if(a[i][j]==a[i-1][j-1]||
a[i][j]==a[i-1][j]||
a[i][j]==a[i-1][j+1]||
a[i][j]==a[i][j-1]||
a[i][j]==a[i][j+1]||
a[i][j]==a[i+1][j-1]||
a[i][j]==a[i+1][j]||
a[i][j]==a[i+1][j-1])
{
if(a[i][j]>=maxn) maxn=a[i][j];
}
}
根据题目理解设置mycmp函数或者选择结构即可
注意选择结构的逻辑性
5.魔法石头
目前还不会QAQ