某人在小时候买了一张车票打算去北京,车票上什么也没印,乘务员告诉他车票上的字到终点站下车就显示出来了,他就坐呀坐,坐到了终点站,下车一看,车票显示:终点站--南京
后来,他就发明了OI赛制。
———《我永远讨厌OI赛制》前言
打表出的两个数学题,先写一下
P9231 [蓝桥杯 2023 省 A] 平方差
思路
先一个循环创造一个0*0,1*1,2*2,3*3......30*30 的 平方数 数组
然后一个两层循环,令平方数数组两两相减,得到的数存到map里面
然后一个for(auto :)输出map中的数
应该有 0,1,3,4,5,7,8,9,11,12,13,15 ...
可以发现每4个数一组,其中 模4为2 的数不符合题意
得到这个性质之后,从 0到R的满足要求的数 - 0到L的满足要求的数 即为答案
AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int l,r;
int ans;
void solve(){
cin>>l>>r;
if(r%4==2){
ans += r/4*3;
ans += 2;
}
else{
++r;
ans += r/4*3;
ans += r%4;
}
if(l%4==2){
ans -= l/4*3;
ans -= 2;
}
else{
++l;
ans -= l/4*3;
ans -= l%4;
++ans;
}
cout<<ans;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int _=1; //cout<<"NOW";
//cin>>_;
while(_--){
solve();
}
return 0;
}
P10900 [蓝桥杯 2024 省 C] 数字诗意
思路
一次循环创造一个数组:1,1+2,1+2+3,1+2+3+4...... 将这个数组中的数存到map里面
注意要开大一点,100以内在后面的操作中连前20的准确性都不能满足
两层循环令数组中的数两两相减,得到的数存到map里面
一个for(auto : )输出map中的数,应该有:1,3,5,6,7,9,10,11,12,13,14,15,17....
除去 1 这个特殊情况,我们可以发现2的各个次方均不在其中
所以对输入的数进行判断,若其为2的幂次,则++cnt
可以通过对2的各个次方进行预处理存在map里面,判断时直接count()即可
AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n;
int cnt,x;
unordered_map<int,bool> out;
void solve(){
cin>>n;
out[0]=true; out[1]=true;
for(int i=1;i<=60;++i) out[pow(2,i)]=true;
//for(auto xx:out) cout<<xx.first<<' ';
for(int i=0;i<n;++i){
cin>>x;
if(out.count(x)) ++cnt;
}
cout<<cnt;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int _=1; //cout<<"NOW";
//cin>>_;
while(_--){
solve();
}
return 0;
}
P8692 [蓝桥杯 2019 国 C] 数正方形
思路
这题没打表,但在纸上画了一下,得出一个规律是:
边长为n的正方形中,有n-1个顶点均在边上的斜正方形(相对于原正方形斜)
得到这个规律之后我们通过一个循环来模拟从边长为1、2、3......n的正方形的统计
AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9+7;
int n;
int ans;
void solve(){
cin>>n;
--n;
for(int i=n;i>0;--i){
ans += i*i*(1+n-i);
ans %= mod;
}
cout<<ans;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int _=1; //cout<<"NOW";
//cin>>_;
while(_--){
solve();
}
return 0;
}
PTA-功夫传人
思路
此题要注意用double
特判:总共就只有祖师爷一个人的情况
其他情况下:因为是一层一层传下去的,所以采用BFS,要记录每一层所在的层数,因为是按比例减少的,所以用 初始功力*百分比的层数次幂*倍数 就是得道弟子的贡献
注意,如果直接模拟每一层的功力衰减的话会RE(坑的要死
AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n; double od,sub;
vector<int> v[100005];
int gl[100005];
int b[100005]={0};
int x,y;
double sum;
queue<int> q;
void bfs(){
int now;
while(!q.empty()){
now = q.front();
q.pop();
for(auto xx:v[now]){
gl[xx]=gl[now]+1;
if(b[xx]){
sum += od*pow(sub,gl[xx])*b[xx];
}
else{
q.push(xx);
gl[xx]=gl[now]+1;
}
}
}
}
void solve(){
cin>>n>>od>>sub; gl[0]=0;
sub=(1-sub/100);
for(int i=0;i<n;++i){
cin>>x;
if(x==0){
cin>>b[i];
}
else{
for(int j=0;j<x;++j){
cin>>y;
v[i].push_back(y);
}
}
}
q.push(0);
bfs();
if(n==1 && b[0]){
cout<<(int)(od*b[0]);
return ;
}
cout<<(int)sum;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int _=1; //cout<<"NOW";
//cin>>_;
while(_--){
solve();
}
return 0;
}
PTA-非常弹的球
思路
模拟题但是物理PART
注意开double,把公式代一下,让程序在允许的时间复杂度和精度要求内停下来就行(不行就改改,IOI赛制多好
AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
double m; double p;
double e = 1000;
double v;
double ans;
double hv,tv;
void solve(){
cin>>m>>p;
m/=100;
p = 1-p/100;
v = sqrt(2*e/m);
hv = tv = v/sqrt(2);
while(hv>0.0000001){
tv = tv*2/9.8;
ans += hv*tv;
e *= p;
v = sqrt(2*e/m);
hv = tv = v/sqrt(2);
}
printf("%.3lf",ans);
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int _=1; //cout<<"NOW";
//cin>>_;
while(_--){
solve();
}
return 0;
}
PTA-天梯赛的赛场安排
思路
首先来看每个学校,其 人数除以单个考场容量 向上取整 即为教练要联系的监考人数
每个学校按顺序存到一个队列中去
每个学校除完的余数存到一个优先队列中,然后按题意进行模拟加考场
AC代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m;
int st;
vector<int> vn;
map<string,int> mp;
string s; int u;
priority_queue< pair<int,string> > q;
queue<string> col;
int ans;
void solve(){
cin>>n>>m;
for(int i=0;i<n;++i){
cin>>s>>u; ans += u/m; col.push(s);
mp[s]=(u+m-1)/m;
q.push({u%m,s});
}
while(!q.empty()){
if(vn.empty() && q.top().first>0){
vn.push_back(m-q.top().first);
q.pop();
++ans;
}
else{
if(q.top().first>0){
bool flag = 1;
for(int i=0;i<vn.size();++i){
if(vn[i]>=q.top().first){
vn[i]-=q.top().first;
flag = 0;
break;
}
}
if(flag){
vn.push_back(m-q.top().first);
++ans;
}
}
q.pop();
}
}
//cout<<"# ";
while(!col.empty()){
cout<<col.front()<<" "<<mp[col.front()]<<'\n';
col.pop();
}
cout<<ans;
}
signed main(){
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int _=1;
//cin>>_;
while(_--){
solve();
}
return 0;
}
419

被折叠的 条评论
为什么被折叠?



