本次模拟赛数据来自民间,代码得分可能会有差异
题目 | 分数 |
---|---|
字节计算 | 5/5 |
合法括号序列 | 5/5 |
蓝桥单词 | 8/8 |
无向连通图 | 7/7 |
反倍数 | 15/15 |
单词加密 | 10/10 |
螺旋矩阵 | 20/20 |
摆动序列 | 25/25 |
村庄建设 | 25/25 |
郊外植树 | 27/30 |
A字节计算
/*
* @Description:
* @Autor: Kadia
* @Date: 2020-08-04 15:58:09
* @LastEditors: Kadia
* @Connect: vx:ccz1354 qq:544692713
* @LastEditTime: 2020-08-04 16:03:08
*/
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=1000000007;
ll power(ll x,int y,int mod){ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans%mod;}
ll power(ll x,int y){ll ans=1;while(y){if(y&1)ans*=x;x*=x;y>>=1;}return ans;}
int main()
{
cout << (ll)(12.5*1024*1024) << endl ;
return 0;
}
B合法括号序列
采用递推或暴力算一下
/*
* @Description:
* @Autor: Kadia
* @Date: 2020-08-04 16:11:16
* @LastEditors: Kadia
* @Connect: vx:ccz1354 qq:544692713
* @LastEditTime: 2020-08-04 16:26:06
*/
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=1000000007;
ll power(ll x,int y,int mod){ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans%mod;}
ll power(ll x,int y){ll ans=1;while(y){if(y&1)ans*=x;x*=x;y>>=1;}return ans;}
int main()
{
cout << "14" << endl ;
return 0;
}
C蓝桥单词
组合问题,A出现两次,其他均出现一次。答案为7的阶乘/2的阶乘
/*
* @Description:
* @Autor: Kadia
* @Date: 2020-08-04 16:11:16
* @LastEditors: Kadia
* @Connect: vx:ccz1354 qq:544692713
* @LastEditTime: 2020-08-04 16:26:38
*/
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=1000000007;
ll power(ll x,int y,int mod){ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans%mod;}
ll power(ll x,int y){ll ans=1;while(y){if(y&1)ans*=x;x*=x;y>>=1;}return ans;}
int main()
{
cout << 7*6*5*4*3 << endl ;
return 0;
}
D无向连通图
连通图中树的边最少
/*
* @Description:
* @Autor: Kadia
* @Date: 2020-08-04 16:26:45
* @LastEditors: Kadia
* @Connect: vx:ccz1354 qq:544692713
* @LastEditTime: 2020-08-04 16:27:55
*/
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=1000000007;
ll power(ll x,int y,int mod){ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans%mod;}
ll power(ll x,int y){ll ans=1;while(y){if(y&1)ans*=x;x*=x;y>>=1;}return ans;}
int main()
{
cout << 2018 << endl ;
return 0;
}
E反倍数
数据太小直接模拟
/*
* @Description:
* @Autor: Kadia
* @Date: 2020-08-04 16:28:16
* @LastEditors: Kadia
* @Connect: vx:ccz1354 qq:544692713
* @LastEditTime: 2020-08-04 16:28:26
*/
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=1000000007;
ll power(ll x,int y,int mod){ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans%mod;}
ll power(ll x,int y){ll ans=1;while(y){if(y&1)ans*=x;x*=x;y>>=1;}return ans;}
int check(int x,int a,int b,int c)
{
return (x%a&&x%b&&x%c);
}
int main()
{
int n,a,b,c;
cin >> n >> a >> b >> c;
int cnt=0;
for(int i=1;i<=n;i++)
cnt+=check(i,a,b,c);
cout << cnt;
return 0;
}
F单词加密
同样是模拟
/*
* @Description:
* @Autor: Kadia
* @Date: 2020-08-04 16:28:45
* @LastEditors: Kadia
* @Connect: vx:ccz1354 qq:544692713
* @LastEditTime: 2020-08-04 16:31:27
*/
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=1000000007;
ll power(ll x,int y,int mod){ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans%mod;}
ll power(ll x,int y){ll ans=1;while(y){if(y&1)ans*=x;x*=x;y>>=1;}return ans;}
int main()
{
string s;
cin >> s;
int len=s.size();
for(int i=0;i<len;i++)
s[i]=(s[i]-97+3)%26+97;
cout << s << endl ;
return 0;
}
G螺旋矩阵
模拟一遍顺序路径,并给二维数组赋值
/*
* @Description:
* @Autor: Kadia
* @Date: 2020-08-04 16:32:30
* @LastEditors: Kadia
* @Connect: vx:ccz1354 qq:544692713
* @LastEditTime: 2020-08-04 16:53:29
*/
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=1000000007;
ll power(ll x,int y,int mod){ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans%mod;}
ll power(ll x,int y){ll ans=1;while(y){if(y&1)ans*=x;x*=x;y>>=1;}return ans;}
int a[1005][1005];
int fxy[5]={0,0,1,0,-1};
int fxx[5]={0,1,0,-1,0};
int main()
{
int n,m,r,c;
cin >> n >> m >> r >> c;
int toward=1;
int cnt=1;
int nowx=1,nowy=1;
while(1)
{
a[nowy][nowx]=cnt++;
if(nowy+fxy[toward]<=n&&nowy+fxy[toward]>=1&&nowx+fxx[toward]<=m&&nowx+fxx[toward]>=1&&a[nowy+fxy[toward]][nowx+fxx[toward]]==0)
{
nowy+=fxy[toward];
nowx+=fxx[toward];
}
else
{
toward++;
if(toward==5)
toward-=4;
if(nowy+fxy[toward]<=n&&nowy+fxy[toward]>=1&&nowx+fxx[toward]<=m&&nowx+fxx[toward]>=1&&a[nowy+fxy[toward]][nowx+fxx[toward]]==0)
{
nowy+=fxy[toward];
nowx+=fxx[toward];
}
else
break;
}
}
cout << a[r][c] << endl ;
return 0;
}
H摆动序列
flag[i]表示最后的一列数字为i的方式有多少种,递推到m
sum[i]表示最后一列的数字小于等于i的方式有多少种,最后的答案即为sum[n]。
/*
* @Description:
* @Autor: Kadia
* @Date: 2020-08-04 17:02:00
* @LastEditors: Kadia
* @Connect: vx:ccz1354 qq:544692713
* @LastEditTime: 2020-08-04 20:02:28
*/
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=10000;
ll power(ll x,int y,int mod){ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans%mod;}
ll power(ll x,int y){ll ans=1;while(y){if(y&1)ans*=x;x*=x;y>>=1;}return ans;}
int n,m;
int flag[1005];
int sum[1005];
int main()
{
cin >> m >> n;
for(int i=1;i<=n;i++)
{
flag[i]=1;
sum[i]=i;
}
for(int i=2;i<=m;i++)
{
if(i&1)
{
for(int j=1;j<=n;j++)
flag[j]=sum[j-1];
for(int j=1;j<=n;j++)
sum[j]=(sum[j-1]+flag[j])%mod;
}
else
{
for(int j=1;j<=n;j++)
flag[j]=(sum[n]-sum[j]+mod)%mod;
for(int j=1;j<=n;j++)
sum[j]=(sum[j-1]+flag[j])%mod;
}
}
cout << sum[n] << endl ;
return 0;
}
I村庄建设
建图求最小生成树
/*
* @Description:
* @Autor: Kadia
* @Date: 2020-08-04 20:07:38
* @LastEditors: Kadia
* @Connect: vx:ccz1354 qq:544692713
* @LastEditTime: 2020-08-04 20:23:16
*/
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=1000000007;
ll power(ll x,int y,int mod){ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans%mod;}
ll power(ll x,int y){ll ans=1;while(y){if(y&1)ans*=x;x*=x;y>>=1;}return ans;}
struct _edge
{
int from;
int to;
double cost;
}edge[1000005];
bool cmp1(_edge a,_edge b)
{
return a.cost < b.cost;
}
struct _city
{
double x;
double y;
double h;
}city[1005];
int par[1005];
void init(int x)
{
for(int i=0;i<=x;i++)
par[i]=i;
}
int findroot(int x)
{
if(par[x]==x)
return x;
else
return par[x]=findroot(par[x]);
}
int same(int x,int y)
{
return findroot(x)==findroot(y);
}
void mix(int x,int y)
{
int rx=findroot(x);
int ry=findroot(y);
if(rx!=ry)
par[ry]=rx;
}
int main()
{
int n;
cin >> n;
for(int i=1;i<=n;i++)
cin >> city[i].x >> city[i].y >> city[i].h;
int cnt=0;
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
cnt++;
_edge tmp;
tmp.from=i;
tmp.to=j;
tmp.cost=sqrt((city[i].x-city[j].x)*(city[i].x-city[j].x)+(city[i].y-city[j].y)*(city[i].y-city[j].y))+(city[i].h-city[j].h)*(city[i].h-city[j].h);
edge[cnt]=tmp;
}
}
sort(edge+1,edge+1+cnt,cmp1);
init(n);
int q=n;
double sum=0;
for(int i=1;i<=cnt;i++)
{
if(q==1)
break;
if(!same(edge[i].from,edge[i].to))
{
sum+=edge[i].cost;
mix(edge[i].from,edge[i].to);
q--;
}
}
printf("%.2f\n",sum);
return 0;
}
J郊外植树
这题没过,只会用dfs(菜是原罪 ),群友告诉用可以用A*
27分代码
/*
* @Description:
* @Autor: Kadia
* @Date: 2020-08-04 20:53:49
* @LastEditors: Kadia
* @Connect: vx:ccz1354 qq:544692713
* @LastEditTime: 2020-08-04 21:19:02
*/
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
typedef long long ll;
using namespace std;
const int mod=1000000007;
ll power(ll x,int y,int mod){ll ans=1;while(y){if(y&1)ans=(ans*x)%mod;x=(x*x)%mod;y>>=1;}return ans%mod;}
ll power(ll x,int y){ll ans=1;while(y){if(y&1)ans*=x;x*=x;y>>=1;}return ans;}
struct _circle
{
int x;
int y;
int r;
int flag[35];
}circle[35];
int ans=0;
int n;
int vis[35];
void dfs(int x,int sum)
{
if(x>n)
{
ans=ans>sum?ans:sum;
return ;
}
if(!vis[x])
{
vis[x]++;
for(int i=1;i<=n;i++)
{
if(circle[x].flag[i]&&x!=i)
vis[i]++;
}
dfs(x+1,sum+circle[x].r*circle[x].r);
for(int i=1;i<=n;i++)
{
if(circle[x].flag[i]&&x!=i)
vis[i]--;
}
vis[x]--;
}
dfs(x+1,sum);
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
memset(circle[i].flag,0,sizeof(circle[i].flag));
for(int i=1;i<=n;i++)
scanf("%d%d%d",&circle[i].x,&circle[i].y,&circle[i].r);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
circle[i].flag[j]+=(circle[i].r+circle[j].r>sqrt((circle[i].x-circle[j].x)*(circle[i].x-circle[j].x)+(circle[i].y-circle[j].y)*(circle[i].y-circle[j].y)));
}
}
dfs(1,0);
printf("%d\n",ans);
return 0;
}