A1.组队(枚举)
思路:我们直接观察图即可!
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"490"<<endl;
return 0;
}
B 2.年号字串
思路:明显是个26进制好吧
那么 2019 = 2*26^2 + 25 * 26 + 17
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"BYQ"<<endl;
return 0;
}
C3.数列求值(大数)
思路:考察递推呗,那你就推呗,每次只要后四位,所以对10000取余就行了。
#include<bits/stdc++.h>
#define maxn 100000004
using namespace std;
typedef long long ll;
int a[maxn];
int main(){
a[1] = 1;
a[2] = 1;
a[3] = 1;
for(ll i=4;i<=20190324;i++){
a[i] = (a[i-1]+a[i-2]+a[i-3])%10000;
}
cout<<a[20190324]<<endl;
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"4659"<<endl;
return 0;
}
D4.数的分解(枚举)
思路:暴力去试试呗,没啥可讲的
#include<bits/stdc++.h>
using namespace std;
int main(){
cout<<"40785"<<endl;
return 0;
}
E 5.迷宫(bfs)
思路:很直接的一个BFS题目。
就是方向数组你记得按照人家说的来。
#include<bits/stdc++.h>
#define maxn 50
using namespace std;
char a[maxn][maxn];
bool vis[maxn][maxn]={0};
int f[4][2] = {{1,0},{0,-1},{0,1},{-1,0}};
char ch[4]={'D','L','R','U'};
int n,m;
struct add{
int x;
int y;
add(int a,int b){
x=a;
y=b;
}
string s;//记录路径
};
void bfs(){
queue<add> q;
add p = {0,0};
p.s = "";
q.push(p);
vis[0][0] = 1;
while(!q.empty()){
add t = q.front();
q.pop();
if(t.x==n-1 && t.y == m-1){
cout<<t.s<<endl;
break;
}
for(int i=0;i<4;i++){
int dx = t.x +f[i][0];
int dy = t.y +f[i][1];
if(dx>=0 && dx<n&&dy>=0&&dy<m){
if(a[dx][dy]=='0' && !vis[dx][dy]){
add k(dx,dy);
k.s = t.s + ch[i];
q.push(k);
vis[dx][dy] = 1;
}
}
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
}
}
bfs();
return 0;
}
F
6.特别数的和(枚举)
思路:没啥可说的,大水题
#include<bits/stdc++.h>
using namespace std;
bool check(int k){
int res;
while(k!=0){
res = k % 10;
if(res==2 || res==0 || res==1 || res==9) return false;
k/=10;
}
return true;
}
int main(){
int n;
cin>>n;
int sum = 0;
for(int i=1;i<=n;i++){
if(!check(i)){
sum += i;
//cout<<i<<endl;
}
}
cout<<sum<<endl;
return 0;
}
G
7.完全二叉树的权值
思路:完全二叉树的层数为 log2(n) + 1;
每层有 pow(2,i)个节点;记得最后一层不一定满的
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define maxn 100003
using namespace std;
int a[maxn];
int qp(int a,int b){
int res = 1;
while(b){
if(b&1) res *= a;
a *= a;
b = b>> 1;
}
return res;
}
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int ce = log2(n)+1;
int k = 0;
int sum;
int ans = -inf;
int res;
for(int i=1;i<ce;i++){
sum = 0;
for(int j=1;j<=qp(2,i-1);j++){
sum += a[k++];
}
if(sum > ans){
ans = sum;
res = i;
}
}
sum = 0;
for(int i=k;i<n;i++){
sum += a[i];
}
if(sum > ans){
res = ce;
}
cout<<res<<endl;
return 0;
}
H
8.等差数列
思路:没啥可说的就是一个公式
因为 an = a1 + (n-1)/d
然后怎么求N少啥你求啥就行了
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define maxn 1000005
using namespace std;
typedef long long ll;
ll a[maxn],b[maxn];
int main(){
ll n;
cin>>n;
for(ll i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
ll res;
bool flag = 0;
ll k;
res = a[1] - a[0];
if(res == 0) flag = 1;
for(ll i=2;i<n;i++){
b[i] = (a[i]-a[i-1]);
res = __gcd(b[i],res);
if(b[i] == 0){
flag = 1;
break;
}
}
if(flag){
cout<<n<<endl;
return 0;
}
ll ans = (a[n-1]-a[0])/res + 1;
cout<<ans<<endl;
return 0;
}
9.后缀表达式
思路:讨论吧,没啥好方法
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 2e5+100;
ll a[maxn];
int main() {
int n,m;
cin >> n >>m;
int num = n+M+1;
int fu = 0;
ll sum = 0;
for (int i = 0; i < num; i++) {
cin >> a[i];
sum += a[i];
if(a[i] < 0) fu++;
}
sort(a, a+num);
if (m){ //如果有减法,需要对比总数目与负数数目
if (fu) { //如果有负数
if (fu == num) { //负数的数目与总目相等(必有一个负数无法通过加括号的形式变为正,故不能加回)
for(int i = 0; i < fu - 1; i++){
sum -= 2ll*a[i]; //输入时sum减过一次这些负数,现在是加回负元素,故应减去两倍(负负得正)。
}
} else { //负数的数目与总数目不相等(所有负数都可以变正,故将所有负数加回)
for (int i = 0; i < fu; i++) {
sum -= 2ll*a[i];
}
}
} else { //如果没有负数,就只有一个负号起作用,减去正数min
sum -= 2ll * a[0];
}
}
//如果没有减法,则最大值就直接是所有数的和
cout << sum << endl;
return 0;
}
最后一题很灵异,没有AC,太弱了,orz