套题分析2013杭电多校测试一

4602.Partition

http://acm.hdu.edu.cn/showproblem.php?pid=4602

快速幂+公式

解:主要是推到公式,然后快速幂。(水)

任务:推导公式+快速幂实现。

附:ac代码

#include<stdio.h>
#define MOD 1000000007
#include<iostream>
using namespace std;
__int64 QuickPow(__int64 a,__int64 b)
{
    __int64 ans = 1;
    while(b>0)
    {
        if(b&1)    ans = (ans*a) %MOD;
        b>>=1;
        a=    (a*a) % MOD;
    }
    return ans;
}
int main()
{
    __int64 t,n,k,ans;
    scanf("%I64d",&t);
    while(t--)
    {
        scanf("%I64d%I64d",&n,&k);
        if(k>n) { printf("0\n");continue; }
        if(n==k)        printf("1\n");
        else if( 1 == (n-k) )    printf("2\n"); 
        else 
        {
            ans = (n-k+3)%MOD;    k=n-k-2;      ans=ans*QuickPow(2,k);
            printf("%I64d\n",ans%MOD);
        }
    }
    return 0;
}


4604.Deque

Lis  nlogn 模板 (可以参考:http://blog.youkuaiyun.com/u010489389/article/details/9456411)

Lis算法中的二分nlogn实现,dp实现会超时,nlogn算法掌握的有点不太牢固,重点看看该算法。

任务:Lis nlogn模板 + dp[ i ] 作用(重点理解),upper_bound()和 lower_bound()函数的用法,返回值。

附:ac代码:

这个题目测试数据有点问题,测试数据太弱,几乎一般的代码都能ac掉。(耗费了我三天,终于ac掉了)。
#include<stdio.h>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a>b?b:a)
#include<iostream>
#include<algorithm>
using namespace std;
int w[100005],dp1[100005],dp2[100005],same1[100005],same2[100005],n;
void up()
{
    int stack[100005],a,b,len;
    memset(stack,1,sizeof(stack));
    stack[0] = w[0];    len = dp1[0] = same1[0] = 1;
    for(int i=1;i<n;i++)
    {
        a = lower_bound(stack,stack+n,w[i])-stack;
        b = upper_bound(stack,stack+n,w[i])-stack;
        same1[i] = b - a + 1;
        if(w[i]>=stack[len-1]) { stack[len++] = w[i]; dp1[i] = len; }       //注意等号
        else{
            int pos = upper_bound(stack,stack+n,w[i]) - stack;              //注意查找区间
            stack[pos] = w[i];
//            cout<<"pos = "<<pos<<endl;
            dp1[i] = pos + 1;
        }
    }
//    for(i=0;i<n;i++)cout<<dp1[i]<<endl;
    return ;
}
void down()
{
    int stack[100005],a,b,len;
    memset(stack,1,sizeof(stack));
    stack[0] = w[0];    len = dp2[0] = same2[0] = 1;
    for(int i=1;i<n;i++)
    {
        a = lower_bound(stack,stack+n,w[i])-stack;
        b = upper_bound(stack,stack+n,w[i])-stack;
        same2[i] = b - a + 1;
        if(w[i]>=stack[len-1]) { stack[len++] = w[i]; dp2[i] = len; }
        else{
            int pos = upper_bound(stack,stack+n,w[i]) - stack;
            stack[pos] = w[i];
            dp2[i] = pos + 1;
        }
    }
//    for(i=0;i<n;i++)cout<<dp2[i]<<endl;
    return ;
}
int main()
{
    int t,i,j;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(i=0;i<n;i++)cin>>w[i];
        reverse(w,w+n);
    //    for(i=0;i<n;i++)cout<<w[i]<<" ";cout<<endl;
        up();
        for(i=0;i<n;i++)
            w[i] = -w[i];
        down();
    //    for(i=0;i<n;i++)cout<<"dp1[i] = "<<dp1[i]<<"  dp2[i] = "<<dp2[i]<<"  same1[i] ="<<same1[i]<<"  same2[i] = "<<same2[i]<<endl;
        int res;    res=0;
        
        for(i=0;i<n;i++)
        {
            res = max(res, dp1[i] + dp2[i] - min(same1[i],same2[i]) );
        }
        cout<<res<<endl;
        
    }
    return 0;
}



4608.I-number

大数模板

大数处理问题,注意:该题目要前导0,此处有点特殊。

任务:大数模板。教材:麦森数处理、求和模板、刘书入门经典:大数模板(可以缓)

附:ac代码

include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
char a[100005];
int b[100005];
int main()
{
    int t,i,len,j=0,sum;
    cin>>t;
    while(t--)
    {
        memset(a,0,sizeof(a));
        memset(b,0,sizeof(b));
        scanf("%s",a);
        len = strlen(a);                                
        j=0;    for(i=len-1;i>=0;i--)b[i] = a[j++]-'0';        
        for(i=1;i<=20;i++)
        {
            b[0]+=1;
            for(j=0;j<len;j++)if(b[j]>9)
            {
                b[j]-=10;
                b[j+1]++;
            }else break;                                    //for(i=len-1;i>=0;i--)cout<<b[i];cout<<"     ";
            if(j==len)len++;
            sum=0;
            for(j=0;j<=len;j++)
            {
                sum+=b[j];
            }                                                //cout<<"sum = "<<sum<<endl;
            if(0 == sum%10)break;
        }
    //    for(i=len;i>=0;i--)if(b[i])break;
        for(j=len-1;j>=0;j--)printf("%c",b[j]+'0');;cout<<endl;

    }
    return 0;
}






源码地址: https://pan.quark.cn/s/d1f41682e390 miyoubiAuto 米游社每日米游币自动化Python脚本(务必使用Python3) 8更新:更换cookie的获取地址 注意:禁止在B站、贴吧、或各大论坛大肆传播! 作者已退游,项目不维护了。 如果有能力的可以pr修复。 小引波 推荐关注几个非常可爱有趣的女孩! 欢迎B站搜索: @嘉然今天吃什么 @向晚大魔王 @乃琳Queen @贝拉kira 第三方库 食用方法 下载源码 在Global.py中设置米游社Cookie 运行myb.py 本地第次运行时会自动生产个文件储存cookie,请勿删除 当前仅支持单个账号! 获取Cookie方法 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 按刷新页面,按下图复制 Cookie: How to get mys cookie 当触发时,可尝试按关闭,然后再次刷新页面,最后复制 Cookie。 也可以使用另种方法: 复制代码 浏览器无痕模式打开 http://user.mihoyo.com/ ,登录账号 按,打开,找到并点击 控制台粘贴代码并运行,获得类似的输出信息 部分即为所需复制的 Cookie,点击确定复制 部署方法--腾讯云函数版(推荐! ) 下载项目源码和压缩包 进入项目文件夹打开命令行执行以下命令 xxxxxxx为通过上面方式或取得米游社cookie 定要用双引号包裹!! 例如: png 复制返回内容(包括括号) 例如: QQ截图20210505031552.png 登录腾讯云函数官网 选择函数服务-新建-自定义创建 函数名称随意-地区随意-运行环境Python3....
### 杭电比赛与童年经历 杭电比赛作为国内知名的 ACM/ICPC 训练平台之,吸引了大量热爱算法的学生参与其中。对于许参赛者来说,这些比赛不仅是技术上的挑战,更是段难忘的成长历程。 从早期的竞赛启蒙来看,很选手最初接触编程和算法完全是因为兴趣使然[^1]。例如,在高中阶段参加 OI 或类似的训练活动时,许人并未意识到其重要性,仅仅将其视为种娱乐方式。这种轻松的心态反而可能带来意想不到的好成绩,比如某次模拟赛中因团队合作默契而意外夺冠的经历。 当提到杭电比赛的具体目或经历时,这类赛事通常会设计系列覆盖广泛知识点的问来考验参赛者的综合能力。以下是几个典型的例子: #### 目示例 1. **基础数据结构应用** 这类目往往考察数组、链表等基本概念的应用场景。 ```cpp // 示例代码:简单的数组遍历求最大值 int findMax(int arr[], int n) { int maxVal = arr[0]; for (int i = 1; i < n; ++i) { if (arr[i] > maxVal) { maxVal = arr[i]; } } return maxVal; } ``` 2. **动态规划入门** 动态规划是 ACM 中非常重要的技巧之,初学者可以通过经典的背包问熟悉该方法。 ```python # 背包问实现 def knapsack(W, wt, val, n): dp = [[0 for _ in range(W + 1)] for __ in range(n + 1)] for i in range(1, n + 1): for w in range(1, W + 1): if wt[i-1] <= w: dp[i][w] = max(dp[i-1][w], dp[i-1][w-wt[i-1]] + val[i-1]) else: dp[i][w] = dp[i-1][w] return dp[n][W] ``` 3. **图论初步探索** 图论相关目常涉及最短路径计算或者连通性分析等内容。 ```java import java.util.*; public class ShortestPath { static final int INF = Integer.MAX_VALUE / 2; public static void dijkstra(List<List<int[]>> adjList, int start, int[] dist){ PriorityQueue<int[]> pq = new PriorityQueue<>(Comparator.comparingInt(a -> a[1])); Arrays.fill(dist, INF); dist[start] = 0; pq.add(new int[]{start, 0}); while(!pq.isEmpty()){ int[] current = pq.poll(); int u = current[0]; if(current[1] > dist[u]) continue; for(int[] edge : adjList.get(u)){ int v = edge[0], weight = edge[1]; if(dist[v] > dist[u] + weight){ dist[v] = dist[u] + weight; pq.add(new int[]{v, dist[v]}); } } } } } ``` 通过上述实例可以看出,无论是童年的简单尝试还是后来深入学习后的复杂解法,每次练习都为未来打下了坚实的基础。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值