| 题目 | 难度 | 知识点 |
|---|---|---|
| A 简单题 | ★ | 简单数学 |
| B 简单题2 | ★ | 简单数学 |
| C 分元宵 | ★ | 快速幂 |
| D 多项式乘法 | ★ | 模拟 |
| E 圆与三角形 | ★ | tan用法 |
| F 三视图 | ★ | 模拟 |
| G あなたの蛙は旅⽴っています | ★★★ | 动态规划(DP) |
| H 写真がとどいています | ★ | 模拟 |
| I あなたの蛙が帰っています | ★★ | 卡特兰数 |
| J おみやげをまらいました | ★ | 模拟 |
简单题
没啥说的,根据题目可以退出极限的值是e。然后模拟就行了。
需要记住的是e的值,很难记住,故记住推理公式会更好。
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
double sum=2.718281828459045;
int t; cin>>t;
while(t--)
{
int a,b,r; cin>>a>>b>>r;
double ans=1;
for(int i=1;i<=a;i++) ans*=sum;
ans*=b;
if(r==1) printf("%.1lf\n",ans);
if(r==2) printf("%.2lf\n",ans);
if(r==3) printf("%.3lf\n",ans);
if(r==4) printf("%.4lf\n",ans);
if(r==5) printf("%.5lf\n",ans);
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
double f(int n)
{
double sum=0;
double a=1.0;
for(int i=1;i<=n;i++)
{
sum+=1.0/a;
a=a*i;
}
return sum;
}
int main(void)
{
int t; cin>>t;
double sum=f(105);
while(t--)
{
int a,b,r; cin>>a>>b>>r;
double ans=1;
for(int i=1;i<=a;i++) ans*=sum;
ans*=b;
if(r==1) printf("%.1lf\n",ans);
if(r==2) printf("%.2lf\n",ans);
if(r==3) printf("%.3lf\n",ans);
if(r==4) printf("%.4lf\n",ans);
if(r==5) printf("%.5lf\n",ans);
}
return 0;
}
简单题2
#include<bits/stdc++.h>
using namespace std;
int main(void)
{
int t; cin>>t;
while(t--)
{
double a,b,r; cin>>a>>b>>r;
double sum=pow(a,2.718281828459045)/b;
if(r==1) printf("%.1lf\n",sum);
if(r==2) printf("%.2lf\n",sum);
if(r==3) printf("%.3lf\n",sum);
if(r==4) printf("%.4lf\n",sum);
if(r==5) printf("%.5lf\n",sum);
}
return 0;
}
分元宵
#include<bits/stdc++.h>
using namespace std;
typedef long long int LL;
LL a,b,c,d,p;
LL quick_sort(LL a,LL b,LL p)
{
LL sum=1;
while(b)
{
if(b&1) sum=sum*a%p;
a=a*a%p;
b=b>>1;
}
return sum%p;
}
int main(void)
{
cin>>a>>b>>c>>d>>p;
cout<<quick_sort((a%p)*(b%p)%p,c*d,p);
return 0;
}
多项式乘法
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int a[N],b[N],c[N],n,m;
int main(void)
{
cin>>n>>m;
for(int i=0;i<=n;i++) cin>>a[i];
for(int i=0;i<=m;i++) cin>>b[i];
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
c[i+j]+=a[i]*b[j];
for(int i=0;i<=n+m;i++) cout<<c[i]<<" ";
return 0;
}
圆与三角形
double tan(double x);
`x`:以弧度为单位的角度值。类型为 `double`
1度=pi/180
#include<bits/stdc++.h>
using namespace std;
const double pi=acos(-1.0);
int main(void)
{
double r; cin>>r;
double ans=0;
for(int i=1;i<180;i++)
{
for(int j=1;j<180;j++)
{
int z=180-i-j;
if(z<=0) continue;
double a=i*pi/180;
double b=j*pi/180;
double c=z*pi/180;
double temp=tan(a/2)*tan(b/2)+
tan(b/2)*tan(c/2)+
tan(a/2)*tan(c/2)+
sin(a)*r;
ans=max(ans,temp);
}
}
printf("%.2lf",ans);
return 0;
}
三视图
就是模拟,需要注意的是输出。
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10;
const int M=1e5+10;
int a[N][N],b[N][N],c[N][N];
int x,y,z,n;
struct node
{
int x,y,z;
}Node[M];
int main(void)
{
cin>>x>>y>>z>>n;
for(int i=0;i<n;i++)
{
int xx,yy,zz; cin>>xx>>yy>>zz;
Node[i].x=xx,Node[i].y=yy,Node[i].z=zz;
}
for(int i=0;i<n;i++)
{
int xx=Node[i].x;
int yy=Node[i].y;
int zz=Node[i].z;
a[y-yy+1][xx]++;
}
for(int i=0;i<n;i++)
{
int xx=Node[i].x;
int yy=Node[i].y;
int zz=Node[i].z;
b[y-yy+1][zz]++;
}
for(int i=0;i<n;i++)
{
int xx=Node[i].x;
int yy=Node[i].y;
int zz=Node[i].z;
c[zz][xx]++;
}
for(int i=1;i<=y;i++)
{
for(int j=1;j<=x;j++)
{
if(a[i][j]) cout<<'x';
else cout<<'.';
}
cout<<" ";
for(int j=1;j<=z;j++)
{
if(b[i][j]) cout<<'x';
else cout<<'.';
}
puts("");
}
puts("");
for(int i=1;i<=z;i++)
{
for(int j=1;j<=x;j++)
{
if(c[i][j]) cout<<'x';
else cout<<".";
}
puts("");
}
return 0;
}
あなたの蛙は旅⽴っています
就是简单的DP,但是问题的难点在于1.如何输入2.如何将其输入的数据压入到二维的数组中。
上图便是,每次从每一行队列中第一个数字取出来,放到第i列的2维数组中去。
#include<bits/stdc++.h>
using namespace std;
const int N=5010;
long long int dp[N][N],n;
long long int cnt[N],cnt1[N];
//cnt[i]是存的每一行该输入多少个数字,可以找规律。
//1, 1 4*n-3行
//2, 1 2 1 2 1
//3, 1 2 3 2 3 2 3 2 1
//cnt1[i]存的二维数组中每一列该有个数字,可以找规律。
int main(void)
{
cin>>n;
memset(dp,-0x3f3f3f3f,sizeof(dp));
for(int i=1;i<=n;i++) cnt[i]=i;
for(int i=4*n-3,j=1,z=1;j<=n;i--,j++,z++) cnt[i]=z;
int flag=n-1;
for(int i=n+1;!cnt[i];i++)
{
cnt[i]=flag;
if(flag==n-1) flag=n;
else flag=n-1;
}
for(int i=1,k=n;i<=n;i++,k++) cnt1[i]=k;
for(int i=n+1,j=1,k=n*2-2;j<=n-1;i++,j++,k--) cnt1[i]=k;
deque<int>q[n*10+10];
for(int i=1;i<=4*n-3;i++)
{
for(int j=1;j<=cnt[i];j++)
{
int x; cin>>x;
q[i].push_back(x);
}
}
for(int i=1;i<=n;i++)
{
vector<int>ve;
for(int j=1;j<=4*n-3;j++)
{
if(q[j].size())
{
ve.push_back(q[j].front());
q[j].pop_front();
}
if(ve.size()==cnt1[i]) break;
}
for(int j=1;j<=cnt1[i];j++) dp[j][i]=ve[j-1];
}
for(int i=n+1,k=2;i<=2*n-1;i++,k++)
{
vector<int>ve;
for(int j=1;j<=4*n-3;j++)
{
if(q[j].size())
{
ve.push_back(q[j].front());
q[j].pop_front();
}
if(ve.size()==cnt1[i]) break;
}
for(int j=1,z=k;j<=cnt1[i];j++,z++) dp[z][i]=ve[j-1];
}
for(int i=2;i<=n*2-1;i++)
{
if(dp[1][i]>-50000) dp[1][i]+=dp[1][i-1];
}
for(int i=2;i<=n*2-1;i++) if(dp[1][i]>-50000) dp[i][1]+=dp[i-1][1];
for(int i=2;i<=n*2-1;i++)
{
for(int j=2;j<=n*2-1;j++)
{
if(dp[i][j]>-50000)
{
long long int temp=dp[i][j];
dp[i][j]=max({dp[i][j-1]+temp,dp[i-1][j-1]+temp,dp[i-1][j]+temp});
}
}
}
cout<<dp[n*2-1][n*2-1];
return 0;
}
写真がとどいています
垃圾题目,还考察五线谱,对于不懂这方面的人根本不行。
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
char a[15][N];
int n;
int main(void)
{
cin>>n;
for(int i=1;i<=9;i++)
for(int j=1;j<=n;j++) cin>>a[i][j];
vector<char>ans;
map<int,char>mp;
mp[1]='F',mp[2]='E',mp[3]='D',mp[4]='C',mp[5]='B',mp[6]='A',mp[7]='G',mp[8]='F',mp[9]='E';
for(int i=1;i<=n;i++)
{
int flag=0;
for(int j=1;j<=9;j++)
{
if(a[j][i]=='o')
{
ans.push_back(mp[j]);
flag=1;
}
}
if(!flag) ans.push_back('|');
}
for(int i=0;i<ans.size();i++) cout<<ans[i];
return 0;
}
あなたの蛙が帰っています
需要预处理,不然每次计算会卡。
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353;
const int N=1e5*5+10;
typedef long long int LL;
LL c[N],a[N],b[N];
LL quick_mi(LL a,LL b,LL p)
{
LL sum=1;
while(b)
{
if(b&1) sum=(sum%p)*(a%p)%p;
a=(a%p)*(a%p)%p;
b=b>>1;
}
return sum%p;
}
void init()
{
a[0]=1,b[0]=1;
for(int i=1;i<=1e5*2;i++)
{
a[i]=(a[i-1]*i)%mod;
b[i]=(b[i-1]*quick_mi(i,mod-2,mod))%mod;
}
for(int i=1;i<=1e5*2;i++)
{
c[i]=(a[i*2]*b[i])%mod;
c[i]=(c[i]*b[i])%mod;
c[i]=c[i]*quick_mi(i+1,mod-2,mod)%mod;
}
}
int main(void) {
init();
int t;
scanf("%d", &t);
for (int i = 1; i <= t; i++) {
LL n; scanf("%lld", &n);
LL ans = (c[n] - c[n - 1] + mod) % mod;
printf("Case #%d: %lld\n", i, ans);
}
return 0;
}
おみやげをまらいました
#include<bits/stdc++.h>
using namespace std;
map<string,string>mp;
map<string,int>st;
int main(void)
{
for(int i=0;i<3;i++)
{
string a,b; cin>>a>>b;
st[a]++,st[b]++;
mp[b]=a;
}
int t; cin>>t;
while(t--)
{
string s; cin>>s;
if(st[s]==0) puts("Fake");
else cout<<mp[s]<<endl;
}
return 0;
}