只会暴力。
1.这题我没问题吧···
//九进制正整数 (2022)9 转换成十进制等于多少?
#include<bits/stdc++.h>
using namespace std;
int main(){
unsigned long long n;
n=2+2*9+0*9*9+2*9*9*9;
cout<<n;
return 0;
}
2.有争议。但从打牌的角度,123,234是顺子,牌里没0所以012不行,打牌出123和321没区别,所以就这样了0v0。不多讨论了,咋说全看出题人。
//在整个 2022年份中,一共有多少个顺子日期(123、456、、)。
#include<bits/stdc++.h>
using namespace std;
int main(){
//0123
//1123
//1230
//1231
return 0;
}
3.这题我没问题吧···
/*
周一开始努力刷题
周一至周五每天做 a 道题目,周六和周日每天做 b 道题目。
第几天实现做题数大于等于 n 题?
1 ≤ a, b, n ≤ 10^18
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
unsigned long long a,b,n,bj=1,day=0,sum=0;
cin>>a>>b>>n;
while(sum<n){
day++;
if(bj<6){
sum+=a;
}else{
sum+=b;
}
bj++;
if(bj>7){
bj=1;
}
}
cout<<day;
return 0;
}
4.找了找规律,写了半天没写对,给我整的蛋疼
/*
有 N 棵灌木整齐的从左到右排成一排。爱丽丝在每天傍晚会修剪一棵灌
木,让灌木的高度变为 0 厘米。爱丽丝修剪灌木的顺序是从最左侧的灌木开始,
每天向右修剪一棵灌木。当修剪了最右侧的灌木后,她会调转方向,下一天开
始向左修剪灌木。直到修剪了最左的灌木后再次调转方向。然后如此循环往复。
灌木每天从早上到傍晚会长高 1 厘米,而其余时间不会长高。在第一天的
早晨,所有灌木的高度都是 0 厘米。爱丽丝想知道每棵灌木最高长到多高。
1 < N ≤ 10000
*/
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
bool flag=1,ou=1;
cin>>n;
int tree[n];
m=n-1;
for(int i=0;i<n;i++){
tree[i]=2*m;
if(flag){
m--;
}else{
m++;
}
if(n%2==1 && m<n/2){
m++;
flag=0;
m++;
}else if(n%2==0 && m<n/2){
if(ou){
m++;
ou=0;
}else{
m++;
flag=0;
m++;
}
}
}
for(int i=0;i<n;i++){
cout<<tree[i]<<endl;
}
return 0;
}
5.这题理解题意就费了很多事······两个数对应位置数字的最大值就是要找的进制啦,我猜的。试着用了对大数求余数的那个定理,也不知道写对没qwq
/*
X 进制是一种很神奇的进制,因为其每一数位的进制并不固定!例如说某
种 X 进制数,最低数位为二进制,第二数位为十进制,第三数位为八进制,则
X 进制数 321 转换为十进制数为 65。
现在有两个 X 进制表示的整数 A 和 B,但是其具体每一数位的进制还不确
定,只知道 A 和 B 是同一进制规则,且每一数位最高为 N 进制,最低为二进
制。请你算出 A - B 的结果最小可能是多少。
//
第一行一个正整数 N,含义如题面所述。
第二行一个正整数 Ma,表示 X 进制数 A 的位数。
第三行 Ma 个用空格分开的整数,表示 X 进制数 A 按从高位到低位顺序各
个数位上的数字在十进制下的表示。
第四行一个正整数 Mb,表示 X 进制数 B 的位数。
第五行 Mb 个用空格分开的整数,表示 X 进制数 B 按从高位到低位顺序各
个数位上的数字在十进制下的表示。
请注意,输入中的所有数字都是十进制的。
//
输出一行一个整数,表示 X 进制数 A - B 的结果的最小可能值转换为十进
制后再模 1000000007 的结果。
//
2 ≤ N ≤ 1000; 1 ≤ Ma, Mb ≤ 100000; A ≥ B.
*/
#include<bits/stdc++.h>
using namespace std;
const unsigned int mod=1000000007;
int main(){
int n;//进制
int ma;//a的位数,之后接每位数字
int mb;//b的位数,之后接每位数字
cin>>n>>ma;
int na[ma];
for(int i=0;i<ma;i++){
cin>>na[i];
}
cin>>mb;
int nb[mb];
for(int i=0;i<mb;i++){
cin>>nb[i];
}
//记录最小进制
int min[ma];
int cha,mi;
cha=ma-mb;
for(int i=ma-1;i>=0;i--){
if(i-cha>=0){
mi=max(na[i],nb[i-cha])+1;
if(mi<2){
mi=2;
}
min[i]=mi;
}else{
mi=na[i]+1;
if(mi<2){
mi=2;
}
min[i]=mi;
}
}
//大数预警
unsigned long long ans=0;
unsigned long long suma=0,sumb=0,t,base=1;
for(int i=ma-1;i>=0;i--){
base=1;
for(int j=1;j<=(ma-1-i);j++){
base*=min[ma-j];
base%=mod;
}
t=na[i]%mod;
suma+=(t*base)%mod;
}
suma%=mod;
for(int i=mb-1;i>=0;i--){
base=1;
for(int j=1;j<=mb-1-i;j++){
base*=min[ma-j];
base%=mod;
}
t=nb[i]%mod;
sumb+=(t*base)%mod;
}
sumb%=mod;
cout<<(suma-sumb)%mod;
return 0;
}
6.写到这个时候时间不多啦,暴力!突然发现里面留着测试用的句子,不记得交的时候删了没,估计没删,焯。
/*
给定一个 N × M 的矩阵 A,请你统计有多少个子矩阵 (最小 1 × 1,最大
N × M) 满足子矩阵中所有数的和不超过给定的整数 K?
1 ≤ N, M ≤ 500; 0 ≤ Ai j ≤ 1000; 1 ≤ K ≤ 250000000.
*/
//运行时间可能超时!!!
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m,k;
cin>>n>>m>>k;
int num[n][m];
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>num[i][j];
}
}
int sum=0,times=0;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){//开始点位
cout<<"when["<<i<<","<<j<<"]"<<endl;
for(int x=i;x<n;x++){
for(int y=j;y<m;y++){//结束点位
cout<<"-to["<<x<<","<<y<<"]"<<endl;
sum=0;
cout<<"sum=";
for(int a=i;a<=x;a++){
for(int b=j;b<=y;b++){
cout<<"+"<<num[a][b];
sum+=num[a][b];
}
}
cout<<"="<<sum<<endl;
if(sum<=k)
times++;
}
}
}
}
cout<<times;
return 0;
}
7.我是这么找了个规律:n为1的时候有一种方法,n为2的时候有一种方法(独特的,排除两个1排在一起),n为3有2种方法(独特的,不含1,2),然后dfs······唉,鬼知道对不对,面向样例编代码了属于是
/*
积木画
,1 ≤ N ≤ 10000000
*/
#include<bits/stdc++.h>
using namespace std;
int n,ff=0;
void digui(int sum,int mj){
int i=1;
if(mj+i<=n){
sum*=1;
mj+=i;
if(mj==n){
ff+=sum;
}else{
digui(sum,mj);
mj-=i;
sum/=1;
}
}
i++;
if(mj+i<=n){
sum*=1;
mj+=i;
if(mj==n){
ff+=sum;
}else{
digui(sum,mj);
mj-=i;
sum/=1;
}
}
i++;
if(mj+i<=n){
sum*=2;
mj+=i;
if(mj==n){
ff+=sum;
}else{
digui(sum,mj);
mj-=i;
sum/=2;
}
}
}
int main(){
cin>>n;
digui(1,0);
cout<<ff;
return 0;
}
8.递归,全~都可以炸完。
/*
输入的第一行包含两个整数 n、m.
接下来的 n 行,每行三个整数 xi, yi,ri,表示一个炸雷的信息。
再接下来的 m 行,每行三个整数 xj, yj,rj,表示一个排雷火箭的信息。
0 ≤ x, y ≤ 109, 0 ≤ n, m ≤ 5 × 104, 1 ≤ r ≤ 10.
*/
#include<bits/stdc++.h>
using namespace std;
int n;
int dl[100000][4];
int hj[100000][3];
void judge(int j){
for(int x=0;x<n;x++){
if(dl[x][0] && sqrt((dl[j][1]-dl[x][1])*(dl[j][1]-dl[x][1])+(dl[j][2]-dl[x][2])*(dl[j][2]-dl[x][2]))<=dl[j][3]){
dl[x][0]=0;
judge(x);
}
}
}
int main(){
int m;
cin>>n>>m;
for(int i=0;i<n;i++){
dl[i][0]=1;
cin>>dl[i][1];
cin>>dl[i][2];
cin>>dl[i][3];
}
for(int i=0;i<m;i++){
cin>>hj[i][0];
cin>>hj[i][1];
cin>>hj[i][2];
}
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
if(dl[j][0] && sqrt((dl[j][1]-hj[i][0])*(dl[j][1]-hj[i][0])+(dl[j][2]-hj[i][1])*(dl[j][2]-hj[i][1]))<=hj[i][2]){
dl[j][0]=0;
judge(j);
}
}
}
int sum=0;
for(int i=0;i<n;i++){
if(dl[i][0]==0){
sum++;
}
}
cout<<sum;
return 0;
}
9.dfs。靠,他都提示取模了,我为什么没有用ull存数?为什么没有用我的求余公式?我是沙壁!
/*
酒壶中有酒 2 斗。他边走边唱:
无事街上走,提壶去打酒。
逢店加一倍,遇花喝一斗。
这一路上,他一共遇到店 N 次,遇到花 M 次。已知最后一次遇到的是花,
他正好把酒喝光了
壶里没酒 ( 0 斗) 时遇店是合法的,加倍后还是没酒;但是没酒时遇
花是不合法的
*/
#include<bits/stdc++.h>
using namespace std;
int n,m;//店,花
int ff=0;
int mod=1000000007;
void digui(int j){
if(n>0){
j*=2;
n--;
digui(j);
n++;
j/=2;
}
if(m>0){
if(j!=0){
j-=1;
m--;
digui(j);
m++;
j+=1;
}
}
if(n==0 && m==0 && j-1==0){
ff++;
}
}
int main(){
cin>>n>>m;
m=m-1;
int jiu=2;
digui(jiu);
cout<<ff%mod;
return 0;
}
10.不会
/*
这天,小明在砍竹子,他面前有 n 棵竹子排成一排,一开始第 i 棵竹子的
高度为 hi.
他觉得一棵一棵砍太慢了,决定使用魔法来砍竹子。魔法可以对连续的一
段相同高度的竹子使用,假设这一段竹子的高度为 H,那么使用一次魔法可以
把这一段竹子的高度都变为 [ sqrt([ H/2 ] + 1 ) ],其中 [x] 表示对 x 向下取整。小明想
知道他最少使用多少次魔法可以让所有的竹子的高度都变为 1。
第一行为一个正整数 n,表示竹子的棵数。
第二行共 n 个空格分开的正整数 hi,表示每棵竹子的高度。
n ≤ 2 × 10^5, hi ≤ 10^18
*/
#include<bits/stdc++.h>
using namespace std;
int n;
unsigned long long bb[1000000];
int main(){
cin>>n;
for(int i=0;i<n;i++){
cin>>bb[i];
}
return 0;
}
总结:吐了,吐了,吐了。再看一遍自己的题解就觉得自己是霎碧,唉,考前做了几天题已经做麻了,可能真的没这个能力?可是找工作好像也要考算法啊qwq再说这才算个锤子算法,还没到难的地方呢。大三了,明年也不会再考了,就这样吧,不想学了。
去年省二,今年口号省二不亏省一血赚。