首页 > 其他分享 >校 第三次热身赛

校 第三次热身赛

时间:2023-12-23 22:22:07浏览次数:28  
标签:p2 p1 第三次 int +....+ sum +...+ 热身赛

A.Buy Lottery Tickets

根据题意直接进行暴力dfs,因为一个return 错了四次 ;

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N], ans[N];
bool st[N];
int m;

void dfs(int u)
{
    if(u > 6)
    {
        for(int i = 1; i <= 6 ; i ++)
        {
            cout << ans[i] << " ";
        }
        cout << endl;
        return ; //此处忘记写return直接WA四发
    }
    
    for(int i = 1 ; i <= m ; i ++)
    {
        if(!st[i] && ans[u - 1] < a[i])
        {
            ans[u] = a[i];
            u ++;
            st[i] = true;
            dfs(u);
            u --;
            st[i] = false;
        }
    }
}

int main()
{
    while(cin >> m)
    {
        memset(a , 0 , sizeof a);
        memset(ans , 0 , sizeof ans);
        memset(st , false , sizeof false);
        
        if(m == 99)
        {
            cout << endl;
            break;
        }
        if(m <= 6 || m >= 13)
        {
            cout << "ERROR" << endl;
            cout << endl;
            continue;
        }
        for(int i = 1; i <= m ; i ++) cin >> a[i];
        
        dfs(1);
        cout << endl;
    }
}

B.Professor's Task

没啥含金量 直接代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
int a[N];

int main()
{
    string s;
    while(getline(cin,s))
    {
        memset(a , 0 , sizeof a);
        for(int i = 0 ;i < s.size() ; i++)
        {
            int t = s[i] - 0;
            if(t >= 97 && t <= 122)
                a[s[i]-97] ++;
        }
        for(int i = 0; i < 26 ; i++)
        {
            cout<<char(i+97) <<':'<< a[i]<<endl;
        }
        cout << endl;
    }
 
    return 0;
}

C.Golden Coins

完全背包(类似)

对于题目所给的意思,也就是说拥有1-17这些平方的纸币,给出一个数(小于300)问用前面这些价值的纸币有多少种方法来凑出这个数;

转化一下问题,就是说:

有17种物品 ,每个物品的体积都是本身的平方 ,给出一个背包体积,问有多少种方法恰好将这个背包装满;

dp问题的难点就在于找状态转移方程的计算;

f[i][j] : 表示在前i个物品中选,且总体积为j的方案数;
状态转移方程计算:
1.如果不包含第 i 个物品 也就是题目所说的纸币; f[i][j] = f [i-1][j];
2.包含第i个物品 并且选k个这个物品 f[i][j] = f[i - 1][j - k * v[i]]; 转换的思想 选第i个也就是说 在前i-1选体积为j-v[i]的方案数;
    
写状态转移方程的时候一定需要保证不重不漏;
此处题解写不优化的完全背包:
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
int v[N] , f[N][N];

int main()
{
    
    for(int i = 0; i <= 17 ; i ++) //预处理体积
        v[i] = i * i; 
    
    int m;
    
    while(cin >> m)
    {
        if(m == 0) break;
        
        f[0][0] = 1; //初始化;
        
        for(int i = 1;i <= 17;i ++)
        {
            for(int j = 0;j <= m;j ++)
            {
                for(int k = 0;v[i] * k <= j;k ++)
                {
                    if(k == 0) f[i][j] = f[i - 1][j]; //k等于0的时候就是不选第i这种情况
                    else f[i][j] += f[i - 1][j - k * v[i]];
                }
            }
        }
        cout << f[17][m] << endl;
    }
    return 0;
}
下面是优化的代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 1000;
int v[N] , f[N][N];

int main()
{
    
    for(int i = 0; i <= 17 ; i ++) //预处理体积
        v[i] = i * i; 
    
    int m;
    
    while(cin >> m)
    {
        if(m == 0) break;
        
        f[0][0] = 1; //初始化;
        
        for(int i = 1;i <= 17;i ++)
        {
            for(int j = 0;j <= m;j ++)
            {
                for(int k = 0;v[i] * k <= j;k ++)
                {
                    if(k == 0) f[i][j] = f[i - 1][j]; //k等于0的时候就是不选第i这种情况
                    else f[i][j] += f[i - 1][j - k * v[i]];
                }
            }
        }
        cout << f[17][m] << endl;
    }
    return 0;
}

D.Happy 2004

数学知识,数论;
A 被分解质因数为:
一个数A = p1^k1 + p2^k2 + p3^k3 .....pn^kn ;一个数A可以为拆分为p1的k1次方 + p2的k2次方 +一直相加;
所以易得 A^B = p1^(k1*B) + p2^(k2*B) +....+pn^(kn*B);

约数个数: (k1+1)*(k2+1)*....*(kn+1);

A的约数之和:  (p1^0+...p1^k1)     *     (p2^0+....+p2^k2)     *...*     (pn^0 +...+ pn^kn);
A^B的约数之和:(p1^(0*B) +...+ p1^(k1*B)) * (p2^(0*B) +....+ p2^(k2*B)) *...* (pn^(0*B) +...+ pn^(kn*B));

所以另sun(p,k) = (p^0+....+p^(k-1));这也是本题要用的重点公式,所以我们需要分析如何求这个sum(p,k);

相当于结论:
//这是k为偶数的条件下;
sum(p,k) = p^0+....+p^(k-1)
         = p^0+...+p^(k/2 - 1)) + (p^(k/2) +...+p^(k - 1)); //发现后一项中都含有p^(k/2);
         = p^0+...+p^(k/2 - 1)) + p^(k/2) * (p^0 + ...+ p^(k/2 - 1));
         = (1 + p^(k/2)) * (p^0 + ...+ p^(k/2 - 1));
         = (1 + p^(k/2)) * sum(p , k/2);
//k为奇数时;
sum(p,k) = p^0+....+p^(k-1)
         = p^0 + p^1 +...+ p^(k-1) //拿出第二项;
         = p^0 + p^1 * (p^0 + p^1 + ... + p^(k - 2))
         = p^0 + p^1 * sum(p,k - 1); 
         = 1 + p * sum(p , k - 1);
         
sum(p,k) = p^0+....+p^(k-1)
         = p^0 + p^1 +...+ p^(k-2) +p^(k-1);
         = sum(p , k - 1) + p^(k-1);  

#include <bits/stdc++.h>
using namespace std;
const int mod = 29;
int m;

int quick_pow(int a , int b) //模板快速幂 a的b次方;
{
    int res = 1;
    
    while(b)
    {
        if(b & 1) res = res * a % mod ;
        a = a * a % mod;
        
        b >>= 1;
    }
    return res;
}

int sum(int p , int k)
{
    if(k == 1) return 1;//只有一项那么 p^0就是1;
    //如果是偶数
    if(k % 2 == 0)
        return (1 + quick_pow(p , k/2)) * sum(p , k/2) % mod; 
        
    //如果是奇数
    if(k % 2)
        return (sum(p , k - 1) + quick_pow(p , k-1)) % mod; //对应上面奇数的第二个公式;
}

int main()
{
    int b;
    while(cin >> b && b != 0)
    {
        int a = 2004;
        int ans = 1;
        for(int i = 2 ; i <= a / i ; i ++) //对a进行因式分解;
        {
            if(a % i == 0)
            {
                int s = 0;
                while(a % i == 0)
                {
                    a /= i;
                    s ++; //这个s就是i的几次方;
                }
                ans = ans * sum(i , s * b + 1) % mod; //也就是求约数之和的公式; 注意要+1,不理解看上面公式
            }
        }
        
        if(a > 1) ans = ans * sum(a , b + 1) % mod; //如果最后a>1说明存在一个质数;那么我们就再算一次;
        if(a == 0) ans = 0;
        cout << ans << endl;
    }
    
}

标签:p2,p1,第三次,int,+....+,sum,+...+,热身赛
From: https://www.cnblogs.com/volapex-lord/p/17923747.html

相关文章

  • Linux第三次总结(期末复习版)
    第四章文件权限4.1基本权限UGOU:owner,属主。G:group,属组。O:other,其他用户。Linux系统通过U、G、O将用户分为三类,并将这三类用户分别设置三种基本权限,这种设置权限的方式称作UGO方式。r:read(读取),数字设定为4。w:write(写入),数字设定为2。x:execute(执行),数字设定为1。其中,owne......
  • 第三次博客
     (1)前言:      本次博客是对之前发布的7-8次PTA题目集(成绩计算系列)以及期末考试的分析。    第7次PTA主要有4道题,两道是容器hashmap的检索和排序。HashMap是Map接口的一个实现类(HashMap实现了Map的接口),它具有Map的特点。Map是用于保存具有映射关系的数据集合,它具......
  • 第三次blog-7-8次PTA题目集及期末考试总结
    一、前言第三次作业主要针对课程成绩统计程序的迭代以及期末考试的总结课程程序2是在第一次的基础上增加了实验课的情况,由于我程序1的框架打的不好,时间过了很久之后记忆不深,加之程序2开始的比较晚,又重新打了一个框架,但仍然很乱很碎,最后匆忙赶了两天也只拿了80分课程程序3在第二......
  • 渗透测试第三次实验
    利用Wiresharks抓包qq图片首先向qq某位联系人发送一张图片,这里有一个很坑的点就是使用QQNT版本无法抓包,所以可以去官网下载旧版qq来抓包 之后打开wireshark,我们知道qq在应用层使用的是OICQ协议,但是信息传输使用的是TCP协议,我们追踪TCP流,并搜索图片头FFD8 打开追踪tcp流,......
  • 第三次总结
    前言:第六次题目集:该次题目集只有一个题目(成绩计算系统),满分一百分,难度较大,但实际上与之前的菜单计价系统类似,老师也在课堂上讲了部分的代码构架,减轻了我们的编写压力,题目背景是自己输入存在的课程名称与类型及考核方式,然后输入学生的信息及科目的名称及成绩,然后输出学生的班级,学号......
  • PTA-第三次机考题解
    PTA-第三次机考题解7-1玩游戏一典型的二分模版题,之前发的第十一次练习题目中对二分有详细的讲解,这道题就是二分的第二种模版,原封不动。相信认真看过的同学还是有思路的。嘿嘿!给没有看过的同学下面再讲一次二分:直接讲整数二分,浮点数二分只需要修改细节就好(直接讲两种模版,所有......
  • PTA第三次总结
    这次是对PTA第七次和第八次的总结,经过上次菜单5次迭代后我对类的设计更加深刻,而这次面对课程成绩统计的迭代二,由于迭代一我还是面向过程写的,多以毫不犹豫我重构了类图,但由于个人原因不小心误删了,所以没有类图展示(,重构代码后只剩两个测试点过不了,因为没有给测试点所以只能结束后取......
  • 第三次博客
    第三次博客前言知识点本次实验最关键的就是课程成绩统计程序,两次实验根据课程成绩统计程序-1一点一点添加功能,难度逐级递增,主要知识点还是与java类有关,其中包括了:方法:类中定义的行为,用于描述对象能够做什么。方法包括普通方法、构造方法和静态方法等。封装:通过访问修饰符(public、p......
  • 21207119-第三次java博客
    前言第三次博客,主要是成绩系统和期末考试题量:不是太大,小题写的会快些,但是系列题找测试点的过程有时候很费时间难度:中等偏上,包含了诸多细节和需求,包括各种异常处理和特殊情况的处理测试与分析7-1容器-HashMap-检索分数10全屏浏览题目切换布局作者 蔡......
  • 聪明办法学python第三次打卡
    #ifelse语句if: else: #elif语句:if: elif: else: #match-case语句:matchmcase1: case2: case3: case4: case5: 一个case也可以设置多个匹配条件,条件使用|隔开......