A..有啥好说的的。。
#include <stdio.h>
#include <iostream>
#include <queue>
#include <algorithm>
#include <map>
#include <vector>
#include <cmath>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <fstream>
#include <set>
#include <stack>
using namespace std;
#define READ freopen("acm.in","r",stdin)
#define WRITE freopen("acm.out","w",stdout)
#define ll long long
#define ull unsigned long long
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define MII map<int,int>::iterator
#define fst first
#define sec second
#define MS(x,d) memset(x,d,sizeof(x))
#define INF 0x3f3f3f3f
#define ALL(x) x.begin(),x.end()
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ROOT 0,n-1,1
#define PB push_back
#define FOR(a,b,c) for(int a=b;a<c;a++)
#define MOD 1000000007
#define keyTree (ch[ ch[root][1] ][0])
#define MAX 200000
int n;
char b[500][500];
bool solve()
{
char x=b[0][0];
char nx=b[0][1];
if(x==nx)
return false;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(j==i||j==n-1-i)
{
if(b[i][j]!=x)
return false;
}
else
{
if(b[i][j]!=nx)
return false;
}
}
}
return true;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
scanf("%s",b[i]);
if(solve())
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
B,考的啥啊这是。。
我最讨厌的——模拟。。浮点数。。
算好下一步要走多少,下一步的目的地,一下下减就可以了
这种4个方向转的,用 dir 模拟好 当成1个方向搞就可以了
#include <stdio.h>
#include <iostream>
#include <queue>
#include <algorithm>
#include <map>
#include <vector>
#include <cmath>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <fstream>
#include <set>
#include <stack>
using namespace std;
#define READ freopen("acm.in","r",stdin)
#define WRITE freopen("acm.out","w",stdout)
#define ll long long
#define ull unsigned long long
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define MII map<int,int>::iterator
#define fst first
#define sec second
#define MS(x,d) memset(x,d,sizeof(x))
#define INF 0x3f3f3f3f
#define ALL(x) x.begin(),x.end()
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ROOT 0,n-1,1
#define PB push_back
#define FOR(a,b,c) for(int a=b;a<c;a++)
#define MOD 10007
#define keyTree (ch[ ch[root][1] ][0])
#define MAX 200
#define SIG 128
int dir[4][2]={1,0,0,1,-1,0,0,-1};
double tar[4][2]={1,0,1,1,0,1,0,0};
double a,d;
int main()
{
double x,y;
x=y=0;
cin>>a>>d;
while(d>a*4)
d-=a*4;
int n;
cin>>n;
int di=0;
for(int i=0;i<n;i++)
{
double t=d;
{
while(t>1e-9)
{
double next=fabs(tar[di][0]*a-x)+fabs(tar[di][1]*a-y);
double p=min(next,t);
x+=p*dir[di][0];
y+=p*dir[di][1];
if(t>next)
di=(di+1)%4;
t-=p;
}
}
printf("%lf %lf\n",x,y);
}
return 0;
}
C题。。
最短路。。
就是把图分层嘛,
第一层只有1个0,第二层全是1,第三层就是2了。
注意可能 wa 的地方 第一个是0只能有一个。。当然 样例给了。。
第二个地方是 最短路必须是连续的 。。
然后你就从上一层的点往下面连边就是了。。
如果出现上一层都满了,下一层还没满,那也是不行的。
#include <stdio.h>
#include <iostream>
#include <queue>
#include <algorithm>
#include <map>
#include <vector>
#include <cmath>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <fstream>
#include <set>
#include <stack>
using namespace std;
#define READ freopen("acm.in","r",stdin)
#define WRITE freopen("acm.out","w",stdout)
#define ll long long
#define ull unsigned long long
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define MII map<int,int>::iterator
#define fst first
#define sec second
#define MS(x,d) memset(x,d,sizeof(x))
#define INF 0x3f3f3f3f
#define ALL(x) x.begin(),x.end()
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ROOT 0,n-1,1
#define PB push_back
#define FOR(a,b,c) for(int a=b;a<c;a++)
#define MOD 10007
#define keyTree (ch[ ch[root][1] ][0])
#define MAX 200
#define SIG 128
vector<int> dis[111111];
int du[111111];
vector<PII> ans;
int maxlen;
int n,k;
bool solve()
{
if(dis[0].size()!=1)
return false;
for(int i=1;i<=maxlen;i++)
{
if(dis[i].size()==0)
return false;
int before=0;
for(int j=0;j<dis[i].size();j++)
{
int be=dis[i-1][before];
int cur=dis[i][j];
if(du[be]>=k)
{
before++;
if(before>=dis[i-1].size())
return false;
be=dis[i-1][before];
}
du[be]++;
du[cur]++;
ans.PB(PII(be,cur));
}
}
return true;
}
int main()
{
cin>>n>>k;
maxlen=-1;
//Notice 1 0
for(int i=1;i<=n;i++)
{
int t;
scanf("%d",&t);
maxlen=max(maxlen,t);
dis[t].PB(i);
}
if(solve())
{
printf("%d\n",ans.size());
for(int i=0;i<ans.size();i++)
printf("%d %d\n",ans[i].fst,ans[i].sec);
}
else
cout<<-1<<endl;
return 0;
}
注意转移方程,不要错啊
dp[i][j] 代表到第 i 步 这里状态是什么。
注意一下 1 其他状态前面状态都确定 唯有1,前面有 * 和 没* 对后面是有影响的。
所以 用两个状态表示1 一个表示前面没* 一个表示前面有*
还有初始和结束情况必须都合法才行。
初始格子不能有 前有有雷的1和2
最后格子不能有 2 和前面没雷的 1
#include <stdio.h>
#include <iostream>
#include <queue>
#include <algorithm>
#include <map>
#include <vector>
#include <cmath>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <fstream>
#include <set>
#include <stack>
using namespace std;
#define READ freopen("acm.in","r",stdin)
#define WRITE freopen("acm.out","w",stdout)
#define ll long long
#define ull unsigned long long
#define PII pair<int,int>
#define PDI pair<double,int>
#define PDD pair<double,double>
#define MII map<int,int>::iterator
#define fst first
#define sec second
#define MS(x,d) memset(x,d,sizeof(x))
#define INF 0x3f3f3f3f
#define ALL(x) x.begin(),x.end()
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define ROOT 0,n-1,1
#define PB push_back
#define FOR(a,b,c) for(int a=b;a<c;a++)
#define MOD 1000000007
#define keyTree (ch[ ch[root][1] ][0])
#define MAX 200
#define SIG 128
int len;
char b[1000010];
ll dp[1000010][5];// 0 0 1 1 mei lei 2 1 you lei 3 2 4 *
bool solve()
{
char c=b[1];
if(b[1]=='?')
{
dp[1][4]=1;
dp[1][0]=1;
dp[1][1]=1;
}
else
{
if(c=='*')
dp[1][4]=1;
else if (b[1]=='0')
dp[1][0]=1;
else if(b[1]=='1')
dp[1][1]=1;
}
for(int i=2;i<=len;i++)
{
if(b[i]=='?')
{
dp[i][0]=(dp[i-1][0]+dp[i-1][2])%MOD;
dp[i][1]=(dp[i-1][0]+dp[i-1][2])%MOD;
dp[i][2]=dp[i-1][4];
dp[i][3]=dp[i-1][4];
dp[i][4]=(dp[i-1][3]+dp[i-1][4]+dp[i-1][1])%MOD;
}
if(b[i]=='1')
{
dp[i][1]=(dp[i-1][0]+dp[i-1][2])%MOD;
dp[i][2]=dp[i-1][4];
}
if(b[i]=='0')
{
dp[i][0]=(dp[i-1][0]+dp[i-1][2])%MOD;
}
if(b[i]=='2')
{
dp[i][3]=dp[i-1][4];
}
if(b[i]=='*')
{
dp[i][4]=(dp[i-1][3]+dp[i-1][1]+dp[i-1][4])%MOD;
}
}
return true;
}
int main()
{
scanf("%s",b+1);
len=strlen(b+1);
solve();
cout<<(dp[len][0]+dp[len][2]+dp[len][4])%MOD<<endl;
return 0;
}