假基础训练营QAQ
这场是一位oi爷出的????所以总体偏简单,有人AK,还有若干只差一两题AK的……当然不包括本蒟蒻啦
#A
链接:https://ac.nowcoder.com/acm/contest/330/A
来源:牛客网
一共有偶数堆石子排成一排,每堆石子的个数为 aiai。两个人轮流取石子,Applese先手。每次取石子只能取最左一堆或最右一堆,且必须取完。最后取得的石子多者获胜。假设双方都足够聪明,最后谁能够获胜呢?
输入描述:
第一行是一个正偶数 n,表示石子的堆数。
第二行是 n 个正整数 a1,a2,…,ana1,a2,…,an,表示每堆石子的个数。
石子总和为奇数
输出描述:
输出一个字符串“Applese”或“Bpplese”,表示胜者的名字。
输入
4
2 3 3 3
输出
Applese
没啥说的,Applese咋都能赢
#include<stdio.h>
int a[100005];
int main(){
int n,i;
scanf("%d",&n);
for(i=0;i<n;i++) scanf("%d",&a[i]);
puts("Applese");
return 0;
}
#B
链接:https://ac.nowcoder.com/acm/contest/330/B
来源:牛客网
在这个游戏中,它位于一个 n 行 m 列的方阵中的左上角(坐标为(0, 0),行的序号为0∼n−1,列的序号为0∼m−1)。
现在它想不重复地走过所有格子(除了起点),最后回到左上角的一个方案。
每次只能往上下左右其中一个方向走一格。
输入描述:
仅一行两个整数 n 和 m,表示方阵的大小。保证大于1×1。
输出描述:
如果存在方案,则输出一行操作,包含"L"、“R”、“U”、“D”,分别表示左、右、上、下。如果有多种方案,输出任意一种即可。
如果没有方案,则在一行中输出"-1"。
输入
复制
2 2
输出
RDLU
输入
复制
2 3
输出
RRDLLU
备注:
1≤n,m≤10
构造出一种通用的最优解法即可,如下:
| _ _ |
| | | | | |
| | | | | |
|| || |_|
类似于走s,注意特判下1,2和2,1
#include<bits/stdc++.h>
using namespace std;
int n,m;
int main()
{
scanf("%d%d",&n,&m);
if(n==1&&m==1)printf("-1\n");
else if(n==1&&m==2)printf("RL\n");
else if(n==2&&m==1)printf("DU\n");
else if((n%2&&m%2)||(n==1)||(m==1))printf("-1\n");
else
{
if(m%2==0)
{
for(int i=1; i<m; i++)
printf("R");
for(int j=1; j<n; j++)
printf("D");
for(int i=1; i<=m-1; i++)
{
if(i%2)
{
printf("L");
for(int j=2; j<n; j++)
printf("U");
}
else
{
printf("L");
for(int j=2; j<n; j++)
printf("D");
}
}
printf("U\n");
}
else
{
for(int i=1; i<n; i++)
printf("D");
for(int j=1; j<m; j++)
printf("R");
for(int i=1; i<=n-1; i++)
{
if(i%2)
{
printf("U");
for(int j=2; j<m; j++)
printf("L");
}
else
{
printf("U");
for(int j=2; j<m; j++)
printf("R");
}
}
printf("L\n");
}
}
return 0;
}
E applese涂颜色
链接:https://ac.nowcoder.com/acm/contest/330/E
来源:牛客网
在这个游戏中,有一个 n 行 m 列的方阵。现在它要为这个方阵涂上黑白两种颜色。规定左右相邻两格的颜色不能相同。请你帮它统计一下有多少种涂色的方法。由于答案很大,你需要将答案对 10^9+7取模。
输入描述:
仅一行两个正整数 n, m,表示方阵的大小。
输出描述:
输出一个正整数,表示方案数对 10^9+7 取模。
输入
复制
1 1
输出
2
1≤n,m≤10^100000
这题得出结论很简单,对于某一列,显然有2^n种涂法,又因为左右相邻的方块异色,所以对于这一列的每一种涂法,方阵情况唯一,所以总数就是
2^n,
然后这题的范围……当场自闭,然后被清神提醒降幂(偷偷膜一膜清神)。补充一下费马小定理:对于计算a^b(mod p) 可简化
对于素数p,任取跟他互素的数a,有a^(p-1)(mod p)=1
所以任取b,有a^b%p=a^(b%(p-1))(%p)从而简化运算
所以就可以愉快的敲了:
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int mod = 1e9 + 7;
const double pi = acos(-1.0);
char s1[N], s2[N];
long long pow_mod(long long a, long long b) {
long long ret = 1;
for(; b; b >>= 1) {
if(b&1) ret = ret*a%mod;
a = a*a%mod;
}
return ret;
}
int main() {
scanf("%s%s", s1, s2);
long long p = 0;
int len=strlen(s1);
for(int i = 0;i<len; ++i) {
p = (p*10 + s1[i] - '0')%(mod - 1);
}
//printf("len==%d,p==%d\n",len,p);
printf("%lld\n", pow_mod(2, p));
return 0;
}
I Applese的字符串
链接:https://ac.nowcoder.com/acm/contest/330/I
来源:牛客网
自从 Applese 学会了字符串之后,精通各种字符串算法,比如……判断一个字符串是不是回文串。
这样的题目未免让它觉得太无聊,于是它想到了一个新的问题。
如何判断一个字符串在任意位置(包括最前面和最后面)插入一个字符后能不能构成一个回文串?
输入描述:
仅一行,为一个由字母和数字组成的字符串 s。
输出描述:
如果在插入一个字符之后可以构成回文串,则输出"Yes", 否则输出"No"。
输入
applese
输出
No
|s|≤10^5
看了数据,On^2肯定TLE,那么巧一点,考虑到添加一个字符成回文串和删掉一个字符成回文串的效果是一样的,然后本身是回文串那么加一个也会是回文串,所以就很好写了
#include <bits/stdc++.h>
using namespace std;
char s[100005];
bool solve(int l,int r,bool flag)
{
while(l<=r)
{
if(s[l]==s[r])
{
l++;
r--;
}
else if(flag==true)
return solve(l+1,r,false)||solve(l,r-1,false);
else
return false;
}
return true;
}
int main()
{
cin>>s;
int len=strlen(s);
if(solve(0,len,true))
printf("Yes");
else
printf("No");
return 0;
}
J
链接:https://ac.nowcoder.com/acm/contest/330/J
来源:牛客网
Applese 最近又长胖了,于是它打算减肥——练习举重。
他在举重的时候用两只手往不同方向用力,从而把杠铃举起来。
已知 Applese 两只手分别产生的力的大小,以及它们之间的夹角,试求两力合力的大小。
输入描述:
仅一行三个整数 f1,f2,a,分别表示两只手产生的力的大小以及它们之间的夹角。
输出描述:
输出一个实数表示两力合力的大小,要求相对误差或绝对误差不超过 10−610−6。严格来讲,如果你的答案是 a,而标准答案是 b,那么当 |a−b|max{1,|b|}≤10−6|a−b|max{1,|b|}≤10−6 时,你的答案会被认为是正确的。
输入
复制
6 8 90
输出
10.0000000000
输入
复制
10 10 60
输出
17.3205080757
平行四边形法则
#include<stdio.h>
#include<math.h>
#define pi 3.141592653589
int main(){
int f1,f2,a;
double ang,F;
while(scanf("%d %d %d",&f1,&f2,&a)!=EOF){
ang=(double)a/180*pi;
F=f1*f1*1.0+f2*f2*1.0+2.0*f1*f2*cos(ang);
printf("%.10f\n",sqrt(F));
}
return 0;
}
未完待续