目录
小红的签到题
?题目:?
思路分析:
代码实现:
小红的ABC
题目:?
思路分析:
代码实现:
小红的口罩
题目:?
思路分析:
代码实现:
小红的数组
题目:?
思路分析:
代码实现:
小红的rpg游戏
题目:
思路分析:
代码实现:
小红的375
题目:
思路分析:
代码实现:
???????
小红的签到题
?题目:
思路分析:
代码实现:
#include<iostream>
using namespace std;
int main(){
int a,b,c;
cin>>a>>b>>c;
cout<<c/a;
}
小红的ABC
题目:
思路分析:
数据小
直接从小到大遍历就行
代码实现:
/*
*@Author: GuoJinlong
*@Language: C++
*/
//#include <bits/stdc++.h>
/*
* __----~~~~~~~~~~~------___
* . . ~~//====...... __--~ ~~
* -. \_|// |||\\ ~~~~~~::::... /~
* ___-==_ _-~o~ \/ ||| \\ _/~~-
* __---~~~.==~||\=_ -_--~/_-~|- |\\ \\ _/~
* _-~~ .=~ | \\-_ '-~7 /- / || \ /
* .~ .~ | \\ -_ / /- / || \ /
* / ____ / | \\ ~-_/ /|- _/ .|| \ /
* |~~ ~~|--~~~~--_ \ ~==-/ | \~--===~~ .\
* ' ~-| /| |-~\~~ __--~~
* |-~~-_/ | | ~\_ _-~ /\
* / \ \__ \/~ \__
* _--~ _/ | .-~~____--~-/ ~~==.
* ((->/~ '.|||' -_| ~~-/ , . _||
* -_ ~\ ~~---l__i__i__i--~~_/
* _-~-__ ~) \--______________--~~
* //.-~~~-~_--~- |-------~~~~~~~~
* //.-~~~--\
* ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*
* 神兽保佑 永无BUG
*/
int main(){
string s;
cin>>s;
int n=s.size();
// cout<<n<<endl;
int f=0;
for(int i=1;i<n;i++){
// cout<<i<<":"<<endl;
for(int j=0;j<=n-i;j++){
int l=j;
int r=l+i;
// cout<<l<<" "<<r<<endl;
int f1=1;
while(l<r){
if(s[l]!=s[r]){
f1=0;
break;
}
l++;
r--;
}
if(f1) {
cout<<i+1<<endl;
f=1;
return 0;
}
}
}
cout<<-1<<endl;
return 0;
}
/**
* ┏┓ ┏┓+ +
* ┏┛┻━━━┛┻┓ + +
* ┃ ┃
* ┃ ━ ┃ ++ + + +
* ████━████+
* ◥██◤ ◥██◤ +
* ┃ ┻ ┃
* ┃ ┃ + +
* ┗━┓ ┏━┛
* ┃ ┃ + + + +Code is far away from
* ┃ ┃ + bug with the animal protecting
* ┃ ┗━━━┓ 神兽保佑,代码无bug
* ┃ ┣┓
* ┃ ┏┛
* ┗┓┓┏━┳┓┏┛ + + + +
* ┃┫┫ ┃┫┫
* ┗┻┛ ┗┻┛+ + + +
*/
小红的口罩
题目:
思路分析:
一个小根堆的运用?
代码实现:
const int MAX=1e5+10;
struct cmp{
bool operator()(int &a,int &b){
return a>b;
}
};
priority_queue<int,vector<int>,cmp>q;
int main(){
int n;
ll k;
cin>>n>>k;
for(int i=0;i<n;i++){
int x;
cin>>x;
q.push(x);
}
int ans=0;
while (!q.empty()&&k) {
int now=q.top();
q.pop();
if(k<now){
break;
}
ans++;
k-=now;
q.push(now<<1);
}
cout<<ans;
}
小红的数组
题目:
思路分析:
先对数组就行sort排序
然后遍历数组 当前元素是a[i]?
那么我们可以用二分
找到a[i]*l<k?的最后一个元素下标为l
找到a[i]*r>k的第一个元素下标为r
那么r-l是等于k的个数
l之前的是小于k的
r之后的是大于k的?
代码实现:
ll a[300005];
int n;
ll k;
ll ans1,ans2,ans3,v1,v2;
int main()
{
n = read();
k = read();
for(int i = 1;i<=n;++i)
a[i] = read();
sort(a+1,a+1+n);
for(int i = 1;i<=n;++i)
{
int l = lower_bound(a + 1 + i,a + 1 + n,1.0 * k / a[i]) - a;
int r = upper_bound(a + 1 + i,a + 1 + n,1.0 * k / a[i]) - a;
ans1+=l-i-1;
ans3+=n-r+1;
ans2+=r-l;
}
printf("%lld %lld %lld",ans3,ans2,ans1);
return 0;
}
小红的rpg游戏
题目:
思路分析:
最开始想的是直接暴力dfs+剪枝可是没过?
然后看题解是状压枚举每个怪物的点是否经过 如果经过就把他和'.'并为一类 否则 和*为一类
然后bfs+剪枝就行
代码实现:
dfs
#include<iostream>
using namespace std;
int n,m,h;
const int MAX=55;
int vis[MAX];
char c[MAX][MAX];
int ans=0x3f3f3f3f;
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
void dfs(int x,int y,int hp,int step){
if(step>ans||x<1||x>n||y<1||y>m||vis[x][y]){
return;
}
if(x==n&&y==m&&ans>step){
ans=step;
return;
}
vis[x][y]=1;
for(int i=0;i<4;i++){
int x1=x+d[i][0];
int y1=y+d[i][1];
if(c[x1][y1]=='.'){
dfs(x1,y1,hp,step+1);
}
else if(c[x1][y1]=='*'){
continue;
}
else if(c[x1][y1]>='0'&&c[x1][y1]<='9'){
dfs(x1,y1,hp-(c[x1][y1]-'0'),step+1);
}
}
vis[x][y]=0;
}
int main(){
cin>>n>>m>>h;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c[i][j];
}
}
dfs(1,1,h,0);
if(ans>=0x3f3f3f3f){
cout<<-1;
}
else cout<<ans;
}
bfs+状压
#include<iostream>
#include<cstdio>
#include<string>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#include<list>
#include<set>
#include<iomanip>
#include<cstring>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<ctime>
#include<cassert>
#include<sstream>
#include<algorithm>
using namespace std;
typedef long long ll;
#define re register //局部
#define PI atan(1.0)*4
#define ull unsigned long long
#define scf(n) scanf("%d",&n)
#define scfl(n) scanf("%lld",&n)
#define prf(n) printf("%d",n)
#define prfl(n) printf("%lld",n)
#define scfd(n) scanf("%lf",&n)
#define prfd(n) printf("%.lf",n)
#define prf10(n) printf("%.10f",n)
#define ls (rt<<1)
#define rs (rt<<1|1)
//#define mid (l+r)/2
#define mms(x, y) memset(x, y, sizeof x)
#define over(i,s,t) for(register long long i=s;i<=t;++i)
#define lver(i,t,s) for(register long long i=t;i>=s;--i)
const int INF = 0x3f3f3f3f;
const double EPS=1e-10;
const double Pi=3.1415926535897;
using namespace std;
int n,m,h;
const int MAX=55;
char c[MAX][MAX];
struct node{
int x,y;
int h;
};
node b[15];
int vis[MAX][MAX];
int ans=0x3f3f3f3f;
int d[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
int main(){
cin>>n>>m>>h;
int ans=0;
int aans=0x3f3f3f3f;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c[i][j];
if(c[i][j]>='0'&&c[i][j]<='9'){
b[ans++]={i,j,c[i][j]-'0'};
}
}
}
for(int i=0;i<(1<<ans);i++){
int vis[MAX][MAX]={0};
int step[MAX][MAX]={0};
int hp=h;
for(int j=0;j<ans;j++){
if(i&(1<<j)){
vis[b[j].x][b[j].y]=1;
hp-=b[j].h;
}
else
vis[b[j].x][b[j].y]=0;
}
if(hp<=0)
continue;
mms(step,-1);
step[1][1]=0;
queue<pair<int,int>>q;
q.push({1,1});
while (!q.empty()) {
if(step[n][m]!=-1) break;
int x=q.front().first;
int y=q.front().second;
q.pop();
for(int i=0;i<4;i++){
int xx=x+d[i][0];
int yy=y+d[i][1];
if(xx==n&&yy==m){
step[xx][yy]=step[x][y]+1;
break;
}
if((c[xx][yy]=='.'||vis[xx][yy]==1)&&step[xx][yy]==-1){
q.push({xx,yy});
step[xx][yy]=step[x][y]+1;
}
}
}
if(step[n][m]!=-1){
aans=min(aans,step[n][m]);
}
}
if(aans>=0x3f3f3f3f){
cout<<-1;
}
else cout<<aans;
}
小红的375
题目:
思路分析:
一道构造题目
375=125*3
那么这个数只需要同时满足?是 3 和125 的倍数就行
3 的倍数简单
125的倍数的话
只需要末尾的三位数字是125的倍数 同时000也行!
利用哈希计数
代码实现:
#include<iostream>
#include<queue>
#define mms(x, y) memset(x, y, sizeof x)
typedef long long ll;
using namespace std;
int has[10];
string bs[8] = {"000","500","750","250","625","375","875","125"};
ll sum;
int main()
{
char c;
while(cin>>c)
has[c-'0']++,sum+=c-'0';
if(sum%3){
cout<<-1<<endl;
return 0;
}
for(int i = 0;i<8;++i)
{
int j = 0;
for(j = 0;j<3;++j)
has[bs[i][j]-'0']--;
for(j = 0;j<=9;++j)
if(has[j]<0) break;
if(j==10)
{
for(j = 9;j>=0;--j)
{
while(has[j]--)
cout<<j;
}
for(j = 0;j<3;++j)
cout<<bs[i][j];
return 0;
}
for(j = 0;j<3;++j)
has[bs[i][j]-'0']++;
}
cout<<-1;
return 0;
}
|