B - 栗酱的文明2
贪心,按国土面积大小排序一下,然后再跑一遍就得到答案了
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1e3 + 10;
int T,n,m,x,y,z;
int a[N];
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
sort(a,a+n);
int ans = 0;
for(int i=n-1;i>=0;i--){
if(a[i]<=ans) break;
ans++;
}
printf("%d\n",ans);
}
return 0;
}
E - 栗酱的数列
这题暴力就能过了
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <math.h>
using namespace std;
#define LL long long
const int N = 2e5 + 10;
const double PI = acos(-1.0);
const double eps = 5e-6;
int T,n,m,k;
int a[N],b[N];
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&m,&k);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<m;i++){
scanf("%d",&b[i]);
}
int ans = 0;
for(int i=0;i<=n-m;i++){
bool flag = true;
int p = (a[i] + b[0]) % k;
for(int j=1;j<m;j++){
if((a[i+j]+b[j])%k!=p){
flag = false;
break;
}
}
if(flag) ans++;
}
printf("%d\n",ans);
}
return 0;
}
E - 栗酱的不等式
暴力+二分
求 y * x ^ 3 <= n 的解的个数,y <= n / ( x ^ 3 ) 遍历,解个数 ans =∑ ⨽n/(i*i*i)⨼遍历 i i>=2&&i*i*i<=n
然后ans 与 n 线性相关二分 n
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;
#define LL long long
const LL N = 1e16;
LL m;
LL slove(LL n){
LL ans = 0;
for(LL i=2;;i++){
if(i*i*i>n) break;
ans += n/(i*i*i);
}
return ans;
}
int main()
{
while(scanf("%lld",&m)!=EOF){
LL l = 8, r = N, mid = 0;
while(l<=r){
mid = (l+r)/2;
LL ans = slove(mid);
if(ans>m){
r = mid - 1;
}else if(ans<m){
l = mid + 1;
}else{
while(slove(mid-1)==m) mid--;
break;
}
}
if(slove(mid)!=m) mid = -1;
printf("%lld\n",mid);
}
return 0;
}
G - 取数游戏2
记忆化搜索
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1e3 + 10;
int T,n,m,x,y,z;
int a[N],b[N],dp[N][N];
int dfs(int l,int r,int pos){
if(l>r) return 0;
if(dp[l][r]==-1){
dp[l][r] = max(dfs(l+1,r,pos+1) + b[pos]*a[l] ,dfs(l,r-1,pos+1)+b[pos]*a[r]);
}
return dp[l][r];
}
int main()
{
scanf("%d",&T);
while(T--){
memset(dp,-1,sizeof dp);
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++){
scanf("%d",&b[i]);
}
int ans = dfs(0,n-1,0);
printf("%d\n",ans);
}
return 0;
}
H - 小周的曲射炮
就是求解方程,刚开始还以为是三维的,后来发现不对
就是求经过点 (x, y) 的抛物线在原点时的切线与x轴的夹角
首先要知道的一个具有初速度的物体仅受重力情况下的运动方: x = v0*t、y = v0*t - 0.5*g*t*t
设夹角为 a, 然后就是分解初速度,水平方向速度为 v * cos(a) 竖直方向速度为 v * sin(a)
因为会经过点 (x, y) 所以可以建立方程组 t = x / ( v*cos(a) ) , y = v * sin(a) * t - 0.5 * g * t * t
带入化简得到 2 * x * sin(a) * cos(a) - 2 * y * cos(a) * cos(a) - g * x * x / v / v = 0
利用三角函数二倍角公式 得到 x * sin(2a) - y * ( cos(2a) + 1 ) - g * x * x / v / v = 0
在利用万能三角函数公式:
sin(2a) = 2 * tan(a) / (1 + tan(a) * tan(a) )
cos(2a) = (1 - tan(a) * tan(a)) / (1 + tan(a) * tan(a) )
tan(2a) = 2 * tan(a) / (1 - tan(a) * tan(a) )
化简方程得到 (g * x * x / v / v) * (1 + tan(a) ) - 2 * x * tan(a) + 2 * y = 0
其中a = g * x * x / v / v; b = 2 * x; c = 2 * y + g * x * x / v / v
然后就是求解一元二次方程
刚开始没化简想直接暴力来跑,先跑个大范围在大范围里面再跑,可能是有误差什么的,只能过68%的数据。。
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
using namespace std;
const double PI = acos(-1.0);
const double g = 9.8;
int T;
double x,y,v;
int main()
{
scanf("%d",&T);
while(T--){
scanf("%lf%lf%lf",&x,&y,&v);
double a = g*x*x/v/v, b = -2*x, c = 2*y+g*x*x/v/v;
double dt = b*b - 4*a*c;
if(dt<0){
printf("NO SOLUTION.\n");
continue;
}
double ans1 = atan((-b+sqrt(dt))/(2*a));
double ans2 = atan((-b-sqrt(dt))/(2*a));
int aa = ans1 * 100000 + 0.5;
int bb = ans2 * 100000 + 0.5;
if(ans1>ans2) swap(ans1, ans2);
if(aa==bb) printf("%.5lf\n",ans1);
else printf("%.5lf %.5lf\n",ans1,ans2);
}
return 0;
}
I - 栗酱和剑仙
就是模拟题,刚开始想计算一下,巧妙的直接求,但是写错了,也不想再想了就直接来模拟了一遍
栗酱先出手,其中一人生命为0及以下则结束模拟
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int T,a,b,c,d;
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d%d%d",&a,&b,&c,&d);
while(a>0||b>0){
a -= d;
if(a<=0) break;
b -= c;
if(b<=0) break;
}
if(a<=0) printf("Yes\n");
else printf("No\n");
}
return 0;
}
J - 栗酱和火柴
就是0到9判一下输出一下的事情
K - qwb的骚扰
没想到居然可以分开好几次打电话!刚开始还以为就只能打一次这样子
就是贪心,先比较一下分开三分钟三分钟打合算还是连着打三分钟合算
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1e3 + 10;
int T,n,m,x,y,z;
int a[N];
int main()
{
scanf("%d",&T);
while(T--){
scanf("%d%d%d",&n,&x,&y);
int ans = 0;
if(y*3<=x){
n -= x;
if(n>=0) ans = 3;
n -= y;
while(n>=0){
ans ++;
n -= y;
}
}else{
ans += (n/x)*3;
if(n-x>0){
n %= x;
ans += (n/y);
}
}
printf("%d\n",ans);
}
return 0;
}
L - qwb与电阻
从后往前递推并联电阻 1/R = 1/R1 + 1/R2 +... + 1/Rn#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = 1e3 + 10;
int T,n,m;
double x,y,z,ans;
int a[N];
double slove(int t){
if(t>=1000) return x + z + 1/( 1/y + 1/(x+z+y));
return x + z + 1/ ( 1/y + 1/slove(t+1));
}
int main()
{
scanf("%d",&T);
while(T--){
scanf("%lf%lf%lf",&x,&y,&z);
ans = 0;
ans = slove(0);
printf("%.2lf\n",ans);
}
return 0;
}