第一次模拟比赛(2015湖南省赛)

本文探讨了高精度数值的大小比较算法,包括整数和小数部分的精细对比,以及通过修改数字来形成完全平方数的策略。此外,还讨论了阶乘除法的最优解求解方法和错误算法的分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

B - 大还是小

题目意思:给你两个“[整数部分].[小数部分]”的实数,每个实数长度不超过100位,问你两者谁大谁小?

模拟高精度即可,先比较实数部分,若两者长度不同,长度大的数就大,若两者长度相同,从头比到尾。

若实数部分相同,就比较小数部分,将他们放到一个数组里面,从头比到位即可。

#include<iostream>
#include<cstring>
using namespace std;
int main()
{
    int t=0;
    int x1[200],x2[200];
    string s1,s2;
    while(cin>>s1>>s2)
    {
        int a,b;
        a=b=0;
        memset(x1,0,sizeof(x1));
        memset(x2,0,sizeof(x2));
        for(int i=0;i<s1.size();++i)
        {
            if(s1[i]=='.')
            {
                a=i;
                break;
            }
        }
        for(int i=0;i<s2.size();++i)
        {
            if(s2[i]=='.')
            {
                b=i;
                break;
            }
        }
        int flag=0;
        if(a<b)    flag=-1;
        else if(a>b)    flag=1;
        else
        {
            for(int i=0;i<a;++i)
            {
                if(s1[i]<s2[i]) {flag=-1;break;}
                if(s1[i]>s2[i]) {flag=1;break;}
            }
            if(flag==0)
            {
                for(int i=a+1;i<s1.size();++i)
                    x1[i-1-a]=s1[i]-'0';
                for(int i=b+1;i<s2.size();++i)
                    x2[i-1-b]=s2[i]-'0';
                for(int i=0;i<100;++i)
                {
                    if(x1[i]<x2[i]) {flag=-1;break;}
                    if(x1[i]>x2[i]) {flag=1;break;}
                }
            }
        }
        cout<<"Case "<<++t<<": ";
        if(flag==0) cout<<"Same\n";
        else if(flag<0) cout<<"Smaller\n";
        else cout<<"Bigger\n";

        }
}

 

 J - 又一道简单题

题目意思:给你一个四位数A,通过修改A的一位数字可以变成其他的(四位的)完全平方数?

暴力枚举即可。

#include<iostream>
using namespace std;
int main()
{
    int t;
    cin>>t;
    for(int j=1;j<=t;++j)
    {
        int n;
        cin>>n;
        int sum=0;
        for(int i=32;i<=99;++i)
        {
            int q=n;
            int tmp=0;
            int p=i*i;
            while(p)
            {
                if(p%10==q%10)
                    tmp++;
                p/=10;
                q/=10;
            }
            if(tmp==3)  sum++;
        }
        cout<<"Case "<<j<<": ";
        cout<<sum<<endl;
    }
}

 F - 阶乘除法

题目意思:给你一个数字k,要你输出两个数字:n,m,其中,k=n!/m!,有多解,输出n最小的,若不存在,输出"Impossible"

枚举连续因子的个数+map预处理

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
map<int,int>m1;
map<int,int>m2;

typedef long long ll;
const int N=1000000000;
int num=0;

void init()
{
    int q=1;
    for(int i=2;i<=13;++i)
    {
        q=q*i;
        int tmp=q;
        for(int j=2;j<=N;++j)
        {
            if((ll)tmp/(j-1)*(j+i-1)>N)   break;
            tmp=tmp/(j-1)*(j+i-1);
            if(m1[tmp])
            {
                if(m1[tmp]>i+j-1)
                {
                    m1[tmp]=i+j-1;
                    m2[tmp]=j-1;
                }
            }
            else
            {
                m1[tmp]=i+j-1;
                m2[tmp]=j-1;
            }
        }
    }
    //cout<<num<<endl;
}
int main()
{
    int t=0;
    int k;
    init();
    while(cin>>k)
    {
        int n,m;
        n=k,m=k-1;
        cout<<"Case "<<++t<<": ";
        if(k==1)  {cout<<"Impossible\n";continue;}

        if(m1[k])
        {
            if(n>m1[k])
            {
                n=m1[k];
                m=m2[k];
            }
        }
        cout<<n<<' '<<m<<endl;
    }
}

D - 错误的算法

题目意思:题目意思

正确解的个数可能不唯一,因此要把他们都找出来,怎么找?每一行每一列的格子暴力枚举即可。

而错误的算法算出来的格子是唯一:即最大行的r最小,最大列的c最小

把两者一一对照即可,又相同的,就是Weak,否则就是Strong

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
struct node{int x,y;};
int a[600][600];
int r[600],c[600];
int n,m,t=0;
node false_ans;
int vis[600][600];

int main()
{
    while(cin>>n>>m)
    {
        mem(r,0);
        mem(c,0);
        mem(vis,0);

        for(int i = 1;i <= n;++i){
            for(int j = 1;j <= m;++ j){
                cin>>a[i][j];
                r[i]+=a[i][j];
                c[j]+=a[i][j];
            }
        }

        int total = 0;
        int cnt = 0;
        for(int i = 1;i <= n;++ i){
            for(int j =1;j <= m;++ j){
                int tmp = r[i] + c[j] - a[i][j];
                if(total < tmp) {
                    total = tmp;
                }
            }
        }
        for(int i = 1;i <= n;++ i){
            for(int j = 1;j <= m;++ j){
                int tmp = r[i] + c[j] - a[i][j];
                if(tmp == total){
                    vis[i][j]=1;
                }
            }
        }

        int k = 0;
        for(int i = 1;i <= n;++ i){
            if(k < r[i]){
                k = r[i];
                false_ans.x = i;
            }
        }
        k = 0;
        for(int i = 1;i <= m; ++i){
            if(k < c[i]){
                k = c[i];
                false_ans.y=i;
            }
        }

        printf("Case %d: ",++t);
        if(vis[false_ans.x][false_ans.y])   printf("Weak\n");
        else printf("Strong\n");
    }
}

H - 聊天止于呵呵

 题目意思:题目意思

注意点:

1.要用while(getline(cin,s))用来读取一行string(含空格,到换行截至),一直都入到文件结尾

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
#define mod 1e9+7
#define PSS pair<string,string>
using namespace std;
int num=0;//不同的对话总数,给不同的对话编以先后顺序,从1开始
string s;
string last[120];//不断替换对话双方的最后一句话
map<PSS,int>dia;

int main()
{
    dia.clear();
    for(int i=0;i<120;++i)  last[i]="";
    //memset(hashs,0,sizeof(hashs));


    while(getline(cin,s))
    {
        getline(cin,s);
        string first,second;
        first=second="";
        int len=s.size();
        int next=0;//是否是第二个名字
        for(int i=0;i<len;++i)
        {
            if(s[i]==':')   break;
            if(s[i]=='-'||s[i]=='>')    {next=1;;continue;}
            if(next==0) first+=s[i];
            if(next==1) second+=s[i];
        }
        if(first>second)    swap(first,second);
        if(dia[make_pair(first,second)]==0)
        {
            num++;
            dia[make_pair(first,second)]=num;
        }

        last[dia[make_pair(first,second)]]=s;
    }

    int hehe=0;
    int skip;
    for(int i=1;i<=num;++i){
        for(int j=0;j<last[i].size();j=j+skip){
            skip=1;
            if(last[i][j]!='h'&&last[i][j]!='H')   continue;
            else
            {
                skip=0;
                int k;
                int ok=1;
                int tran=0;
                for(k=j;k<last[i].size();++k)
                {
                    skip++;
                    if(last[i][k]==' ') break;
                    if(tran==0&&(last[i][k]=='h'||last[i][k]=='H'))
                    {
                        tran=!tran;
                        continue;
                    }
                    if(tran==1&&(last[i][k]=='e'||last[i][k]=='E'))
                    {
                        tran=!tran;
                        continue;
                    }
                    else    ok=0;
                }
                if(last[i][k-1]!='e'&&last[i][k-1]=='E')    ok=0;
                if(ok)  hehe++;
            }
        }
    }

    cout<<hehe*100.0/num<<"%\n";
}

 

内容概要:本文详细介绍了基于FPGA的144输出通道可切换电压源系统的设计与实现,涵盖系统总体架构、FPGA硬件设计、上位机软件设计以及系统集成方案。系统由上位机控制软件(PC端)、FPGA控制核心和高压输出模块(144通道)三部分组成。FPGA硬件设计部分详细描述了Verilog代码实现,包括PWM生成模块、UART通信模块和温度监控模块。硬件设计说明中提及了FPGA选型、PWM生成方式、通信接口、高压输出模块和保护电路的设计要点。上位机软件采用Python编写,实现了设备连接、命令发送、序列控制等功能,并提供了一个图形用户界面(GUI)用于方便的操作和配置。 适合人群:具备一定硬件设计和编程基础的电子工程师、FPGA开发者及科研人员。 使用场景及目标:①适用于需要精确控制多通道电压输出的实验环境或工业应用场景;②帮助用户理解和掌握FPGA在复杂控制系统中的应用,包括PWM控制、UART通信及多通道信号处理;③为研究人员提供一个可扩展的平台,用于测试和验证不同的电压源控制算法和策略。 阅读建议:由于涉及硬件和软件两方面的内容,建议读者先熟悉FPGA基础知识和Verilog语言,同时具备一定的Python编程经验。在阅读过程中,应结合硬件电路图和代码注释,逐步理解系统的各个组成部分及其相互关系。此外,实际动手搭建和调试该系统将有助于加深对整个设计的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值