首页 > 其他分享 >小白月赛71 补题

小白月赛71 补题

时间:2023-04-22 23:55:06浏览次数:42  
标签:__ cout int ans 补题 71 小白月赛 int128 define

C

结束发现这题数据很水直接假做也能过

1:

比赛想到了利用log,可以用log(2e19)粗略判断然后再暴力

#include<bits/stdc++.h>
using namespace std;

#define endl '\n'
#define LL long long
#define ph push_back
#define INF 0x3f3f3f3f
#define PII pair<int, int>
const double M=log(2e18);
double a[100];
int main(){
cin>>a[1]>>a[2];
int ans=3;
while(1){
if(a[ans-1]*log(a[ans-2])>M){
cout<<ans-1;
break;
}//利用log在每次操作粗略判断是否溢出,如果没有溢出,我们知道可以计算出该项
else{
a[ans]=1;
for(int i=1;i<=a[ans-1];i++){
a[ans]*=a[ans-2];

}
if(a[ans]>1e18){
cout<<ans;
break;
}


}
ans++;
}
return 0;
}

 

2.利用__int128直接做

之前没用过,算是学新知识了,注意__int128不能调用cin,cout,其他用法与int类型基本相同,我们要手写read和print操作(但是好像没用到hhh)

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int,int>
__int128 M=1e18;
__int128 read() {
__int128 ans = 0;
string str; cin >> str;

for(int i = 0; i < str.size(); i ++) {
ans = ans * 10 + (str[i] - '0');
}

return ans;
}
__int128 qmi(__int128 a , __int128 b){
__int128 res=1;
while(b--){
res=res*a;
if(res>M)return 1e19;
}
return res;
}
void print(__int128 x) {
if(x > 9) print(x / 10);
putchar(x % 10 + '0');
}
__int128 a[100];
void solve(){
int p,q;
cin>>p>>q;
a[1]=p,a[2]=q;
for(int i=3;i<=20;i++){
a[i]=qmi(a[i-2],a[i-1]);
}
for(int i=1;i<=20;i++){
if(a[i]>M){
cout<<i-1;
return ;
}

}

}
signed main(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
std::cout.tie(nullptr);
int T=1;
while(T--)solve();
}

 

 

 

D

1.按我的思路加上各位大佬的题解结合总算是补出来了QAQ,还挺有成就感,这题我的排序出了问题,应该按找主人期望友善值从小到大排序,并且还要用到一个max数组存储前面出现的最大值,这题我学到的东西是二分的运用

这题二分不是二分答案了,而是找最大满足条件的主人期望友善值得到一个合法的范围,再利用max数组,出现过的最大值满足猫咪这最大值就是我们要的,这最大值不满足那就没咱要的值了

#include <bits/stdc++.h>
using namespace std;

#define endl '\n'
#define LL long long
#define ph push_back
#define INF 0x3f3f3f3f
#define PII pair<int, int>
const int N =2e5+10;
int t;
int n,m;
int a[N],c[N];
int mx[N];
struct ren{
int b,d;
     bool operator<(const ren &W) const
  {
        return d==W.d?b>W.b:d<W.d;
  }
} ren[N];

void solve()
{
    cin>>n>>m;
    
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n;i++){
        cin>>c[i];
     
    }
    for(int i=1;i<=m;i++) {
        cin>>ren[i].b;
     
    }
    for(int i=1;i<=m;i++){
        cin>>ren[i].d;
    }
    sort(ren+1,ren+1+m);
//     for(int i=1;i<=m;i++){
//         cout<<ren[i].b<<' '<<ren[i].d<<endl;
//     }
 for(int i=1;i<=m;++i) mx[i]=max(mx[i-1],ren[i].b);//记录下前i个元素下主人最大的友善值
    for(int i=1;i<=n;i++){
    if(ren[1].d>a[i]){
        cout<<-1<<' ';
        continue;
    }
        //二分找到满足猫咪可以配对主人条件中主人期望的最大值,从而得到满足猫咪友善值与主人期望友善值匹配的范围
        //由于记录了前i个元素主人最大的友善值,我们在这个范围找到最大值(mx[l])如果最大值满足猫咪期望友善值这就是我们要找的,如果不满足,则没有满足的
    int l=-1,r=m+1;
    while(l+1!=r){
        int mid=(l+r)>>1;
        if(ren[mid].d<=a[i]) l=mid;
        else r=mid;
    }
    if(mx[l]>=c[i]) cout<<mx[l]<<' ';
        else cout<<-1<<' ';
    }
  
}
int main()
{
  ios::sync_with_stdio(false);
  cin.tie(nullptr), cout.tie(nullptr);
//   cin >> t;
  t=1;  
  while (t--)
  {
    solve();
  }
  return 0;
}

 2.离线查询,考虑开结构体时加上元素id,这样我们在sort之后存储答案后也能找到对应询问顺序的答案,这是我看视频才知道这叫离线询问的思想,然后我找到了一道codeforces上的题目 Problem - D - Codeforces 这题直接写会超时,我们利用set储存所有可能的查询这样我们每次询问的时候将多次询问问题实际上换成了一次询问的问题

Codeforces Round 689 (Div. 2, based on Zed Code Competition)D.Divide and Summarize - 蝴蝶眨几次眼睛丶 - 博客园 (cnblogs.com)

#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
struct T
{
    int x, y,id;
}s1[N],s2[N];
bool cmp(T a,T b)
{
    if(a.x!=b.x)return a.x<b.x;
    if(a.y!=b.y)return a.y<b.y;
    return a.id < b.id;
}
int ans[N];

int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>s1[i].x;
    for(int i=1;i<=n;i++)cin>>s1[i].y;
    for(int i=1;i<=m;i++)cin>>s2[i].y;
    for(int i=1;i<=m;i++)cin>>s2[i].x;
    for(int i=1;i<=n;i++)s1[i].id=i;
    sort(s1+1,s1+n+1,cmp);
    sort(s2 + 1, s2 + 1 + m, cmp);
    int t=1,mx=-1;
    for(int i=1;i<=n;i++){
        while(t<=m&&s2[t].x<=s1[i].x){
            mx=max(mx,s2[t].y);
            t++;
        }
        if(mx>=s1[i].y)ans[s1[i].id]=mx;
        else
            ans[s1[i].id] = -1;
    }
    for(int i=1;i<=n;i++)
        cout << ans[i] << " ";
    
    return 0;
}

 

E

 

#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 17;
typedef long long ll;
int main()
{
    ll a, b;
    cin >> a >> b;
    if(a == b + 1 || a + 1 == b) cout << -1;
    else if(__gcd(a,b) != 1) cout << 0;
    else if(a%2 == 1 && b%2 == 1) cout << 1;
    else
    {
        ll m = abs(a - b);
        ll mi = m - a%m;
            for(ll i = 2; i * i <= m; i ++)
                if(m % i == 0)
                {
                    mi = min(mi, i - a%i);
                    mi = min(mi, m/i - a%(m/i));
                }
            cout << mi;
    }
    return 0;
}

 

标签:__,cout,int,ans,补题,71,小白月赛,int128,define
From: https://www.cnblogs.com/xumaolin/p/17342638.html

相关文章

  • 【读书笔记】ISBN9787121353932
     【前言】是否所有人都可以公平地享受科技发展带来的生产力进步?AIGC应用越完善,内容生产的社会必要劳动时间就越少,人工就越没有价值。全社会新增劳动岗位的速度很快就会跟不上AIGC应用取代人工的速度,而不会使用AIGC应用的劳动者可能将无法获得收入、无法进行消费,从而逐步被剥离......
  • CF1714D 题解
    CF1714D题解description给定黑色文本\(t\)和\(n\)个字符串\(s_1,s_2...s_n\).一次操作可以将\(t\)中与\(s_i\)相等的子串涂成红色。一个位置多次涂色后仍是红色。\(s_i\)可以使用多次。求将\(t\)涂成红色的最小次数,并输出方案。无解输出-1.\(|t|\leq100\)......
  • 洛谷:P5716日份天数
    题目描述输入年份和月份,输出这一年的这一月有多少天。需要考虑闰年。输入格式输入两个正整数,分别表示年份\(y\)和月数\(m\),以空格隔开。输出格式输出一行一个正整数,表示这个月有多少天。样例#1样例输入#119268样例输出#131样例输入#220002样例输出#229......
  • CF1716D
    ChipMove-洛谷|计算机科学教育新生态(luogu.com.cn)背包DP:这道题与完全背包不一样的地方便是:至少要拿一个物品。DP[i,j]为前i个物品,每个至少拿一个,体积为j时的方案数转移方程:DP[i,j]=DP[i-1,j-w[i]]+DP[i,j-w[i]](具体见蓝书P277)然后用滚动数组优化空间复杂度由于是滚......
  • 【DP】LeetCode 718. 最长重复子数组
    题目链接718.最长重复子数组思路分析动态规划题目的时候只需要考虑最后一个阶段,因为所有的阶段转化都是相同的,考虑最后一个阶段容易发现规律在数组的动态规划问题中,一般dp[i]都是表示以nums以第i个元素组成(即nums[i-1])的状态;dp[i][j]分别表示以nums1前i个元素(......
  • 牛客小白月赛71 补题记录
    AB:略C:可以转化为比较对数,然后直接模拟即可(longdouble128位表示范围\(-1.2\times10^{-4932}~1.2\times10^{4932}\))代码如下:#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;//------------------------intmain(void){ ios::sync_with_stdi......
  • day52 300.最长递增子序列 | 674. 最长连续递增序列 | 718. 最长重复子数组
    给你一个整数数组nums,找到其中最长严格递增子序列的长度。子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7]是数组[0,3,1,6,2,2,7]的子序列。示例1:输入:nums=[10,9,2,5,3,7,101,18]输出:4解释:最长递增子序列是[2,3,7,101......
  • 小白月赛71
    C.猫猫与数列可以猜测,答案应当很小,所以可以直接暴力判断最大的n首先我们可以走两种路:第一种,利用求对数来比较,注意精度问题即可,但我感觉这里的快速幂会溢出嘛?while(1){ a=qpow(x,y); if(y*log(x)>log(maxm)+1e-5)break; ++c; x=y;y=a;}cout<<c<<"\n";第二种做法,快速幂......
  • 华中农业大学2023年十二届程序设计竞赛(补题)
    题目地址B.写信题意:有n个信封和n封信,问全部装错有多少种可能Solution全错排问题,对于i=k的情况,我们可以从i=k-1和i=k-2转移过来一种是k-1个全错排,然后从前面k-1个选出一个信封与第k个交换另一种是任选一个j,有1<=j<=k-1放在k,这样除了k和j以外还有k-2个数进行全错位排列,这样我......
  • 力扣---1071. 字符串的最大公因子
    对于字符串s和t,只有在s=t+...+t(t自身连接1次或多次)时,我们才认定“t能除尽s”。给定两个字符串str1和str2。返回最长字符串x,要求满足x能除尽str1且X能除尽str2。示例1:输入:str1="ABCABC",str2="ABC"输出:"ABC"示例2:输入:str1="ABABAB",str2=......