2021 年百度之星·程序设计大赛 - 初赛三题解
数字游戏
#include<bits/stdc++.h>
using namespace std;
int maxx,minn,ave,n;
void solve()
{
cin>>n>>maxx>>minn>>ave;
int a=maxx+(n-1)*minn;
int b=minn+(n-1)*maxx;
//ave*=n;
if(n*ave<=b&&n*ave>=a&&ave>=minn&&ave<=maxx)cout<<"yes"<<endl;
else cout<<"no"<<endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--){
solve();
}
}
网格路径
这道题蛮恶心的,看似简单,但是我用dfs和传纸条那样的dp都写不了
#include <bits/stdc++.h>
using namespace std;
int test, n;
char str[11][11];
bool b[11][11], c[11][11];
int main() {
scanf("%d", &test);
for (; test--; ) {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%s", str[i] + 1);
if (str[1][1] == '#' || str[n][n] == '#') {
printf("0\n");
continue;
}
memset(b, false, sizeof(b));
b[n][n] = true;
for (int i = n; i; --i)
for (int j = n; j; --j)
if (str[i][j] == '.') {
if (i < n && b[i + 1][j])
b[i][j] = true;
if (j < n && b[i][j + 1])
b[i][j] = true;
}
if (!b[1][1]) {
printf("0\n");
continue;
}
int ans = 1;
int x = 1, y = 1;
memset(c, false, sizeof(c));
for (; x != n || y != n; ) {
if (y < n && b[x][y + 1])
y++;
else
x++;
c[x][y] = true;
}
c[n][n] = false;
bool ok = true;
x = 1, y = 1;
for (; x != n || y != n && ok; ) {
if (x < n && b[x + 1][y])
x++;
else
y++;
if (c[x][y])
ok = false;
else
c[x][y] = true;
}
if (ok)
ans++;
printf("%d\n", ans);
}
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,t;
int T;
int main(){
cin>>T;
while(T--)
{
int x1,x2;
t=0x3f3f3f3f;
cin>>n>>m>>x1>>x2;
if(x1==1||x2==m){puts("0");continue;}
if(x1==x2)t=(n-1)/2;
else t=(n+abs(x1-x2))/2-1;
t=min(t,x1-1);
t=min(t,m-x2);
t=min(t,n-1);
cout<<(long long)t*t<<endl;
}
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,t;
int T;
int cnt;
bool vis[100];
bool check(){
for(int i=2;i<=n;i++)if(vis[i]==0)return false;
return 1;
}
inline int mo(int u,int i){
if(i+u<n)return u+i;
if(i+u==n)return n;
if(i+u>n)return (i+u)%n;
}
inline int mo2(int u,int i){
if(u>i)return u-i;
if(u==i)return n;
if(u<i)return n+u-i;
}
inline void dfs(int u,int x)
{
if(x==n){cnt++;return;}
int a=mo(u,x);
if(!vis[a])vis[a]=1,dfs(a,x+1),vis[a]=0;
int b=mo2(u,x);
if(!vis[b])vis[b]=1,dfs(b,x+1),vis[b]=0;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>T;
while(T--)
{
cin>>n;
memset(vis,0,sizeof vis);
vis[1]=1;
cnt=0;
dfs(1,1);
cout<<cnt<<endl;
}
}
我这个代码跟标准答案相比只不过是把取模运算单独包装了出来,居然还是超时了,真的是无理取闹,为了防止被卡常,还是留个心眼吧(dfs的函数尽量封装到dfs函数里面不要拿出来)
所以我一气之下直接预处理全部
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m,t;
int T;
int cnt;
bool vis[100];
int ans[100];
bool check(){
for(int i=2;i<=n;i++)if(vis[i]==0)return false;
return 1;
}
inline int mo(int u,int i){
if(i+u<n)return u+i;
if(i+u==n)return n;
if(i+u>n)return (i+u)%n;
}
inline int mo2(int u,int i){
if(u>i)return u-i;
if(u==i)return n;
if(u<i)return n+u-i;
}
inline void dfs(int u,int x)
{
if(x==n){cnt++;return;}
int a=mo(u,x);
if(!vis[a])vis[a]=1,dfs(a,x+1),vis[a]=0;
int b=mo2(u,x);
if(!vis[b])vis[b]=1,dfs(b,x+1),vis[b]=0;
}
int main(){
ans[1]=1,
ans[2]=2,
ans[3]=2,
ans[4]=4,
ans[5]=2,
ans[6]=4,
ans[7]=4,
ans[8]=8,
ans[9]=2,
ans[10]=4,
ans[11]=6,
ans[12]=8,
ans[13]=2,
ans[14]=8,
ans[15]=6,
ans[16]=16,
ans[17]=2,
ans[18]=4,
ans[19]=6,
ans[20]=8,
ans[21]=4,
ans[22]=12,
ans[23]=6,
ans[24]=16,
ans[25]=4,
ans[26]=4,
ans[27]=4,
ans[28]=16,
ans[29]=2,
ans[30]=12,
ans[31]=10,
ans[32]=32,
ans[33]=4,
ans[34]=4,
ans[35]=8,
ans[36]=8,
ans[37]=2,
ans[38]=12,
ans[39]=6,
ans[40]=16,
ans[41]=2,
ans[42]=8,
ans[43]=6,
ans[44]=24,
ans[45]=6,
ans[46]=12,
ans[47]=8,
ans[48]=32,
ans[49]=6,
ans[50]=8,
ans[51]=6,
ans[52]=8,
ans[53]=2,
ans[54]=8,
ans[55]=10,
ans[56]=32,
ans[57]=4,
ans[58]=4,
ans[59]=6,
ans[60]=24,
ans[61]=2,
ans[62]=20,
ans[63]=6,
ans[64]=64,
ans[65]=6,
ans[66]=8,
ans[67]=8,
ans[68]=8,
ans[69]=4,
ans[70]=16,
ans[71]=6,
ans[72]=16,
ans[73]=2,
ans[74]=4,
ans[75]=8,
ans[76]=24,
ans[77]=14,
ans[78]=12,
ans[79]=6,
ans[80]=32;
cin>>T;
while(T--)
{
cin>>n;
cout<<ans[n]<<endl;
}
// for(int i=2;i<=80;i++){
// memset(vis,0,sizeof vis);
// vis[1]=1;
// cnt=0;
// n=i;
// dfs(1,1);
// printf("ans[%d]=%d,\n",i,cnt);
// }
}
直接0秒解决战斗(气死我了!!!