当前位置: 首页 > news >正文

浙江大学PAT考试1069~1072(2013-11-2)

11


题目地址:http://pat.zju.edu.cn/contests/pat-a-practise


1069:

由下降序和上升序两个四位数不断相减,然后得到新数据,始终会到达一个数字终止。

递归能够写,简单。

AC代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
int p[4];

void dfs(int a,int b)
{
    int del=a-b;
    printf("%04d - %04d = %04d\n",a,b,del);
    if(del==6174||del==0) return;
    int i=0;
    while(i<4)
    {
        p[i]=del%10;
        del/=10;
        i++;
    }
    sort(p,p+4);
    int m1=p[3]*1000+p[2]*100+p[1]*10+p[0];
    int m2=p[0]*1000+p[1]*100+p[2]*10+p[3];
    dfs(m1,m2);
}

int main()
{
    int n;
    while(cin>>n)
    {
        int i=0;
        while(i<4)
        {
            p[i]=n%10;
            n/=10;
            i++;
        }
        sort(p,p+4);
        int m1=p[3]*1000+p[2]*100+p[1]*10+p[0];
        int m2=p[0]*1000+p[1]*100+p[2]*10+p[3];
        dfs(m1,m2);
    }
    return 0;
}


1070:

依照比值排序。遍历就可以。

AC代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const double eps=1e-12;

struct node
{
    double num;
    double price;
}nod[1005];

int cmp(node p1,node p2)
{
    if(p1.price/p1.num>=p2.price/p2.num) return 1;
    return 0;
}

int main()
{
    int n,i;
    double total;
    while(cin>>n>>total)
    {
        for(i=0;i<n;i++) cin>>nod[i].num;
        for(i=0;i<n;i++) cin>>nod[i].price;
        sort(nod,nod+n,cmp);

        double res=0;
        for(i=0;i<n;i++)
        {
            if(total>nod[i].num)
            {
                res+=nod[i].price;
                total-=nod[i].num;
            }
            else
            {
                res+=nod[i].price*(total/nod[i].num);
                break;
            }
        }
        printf("%.2f\n",res);
    }
    return 0;
}

/*
3 200
180 150 100
7.5 7.2 4.5
*/


1071:

就是让你在一段文字中找出现最多次数的单词,模拟就可以。

AC代码:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<cstring>
#include<string>
#define maxn 1050000
using namespace std;

char str[maxn];

char ans[maxn];
char tmp[maxn];
int ans1;

map <string,int> mq;

int judge(char p1)
{
    if(p1>='0'&&p1<='9') return 1;
    if(p1>='a'&&p1<='z') return 1;
    if(p1>='A'&&p1<='Z') return 1;
    return 0;
}

int main()
{
    int len,i,p;
    while(gets(str))
    {
        strcpy(ans,"");   //³õʼ»¯
        ans1=0;
        mq.clear();

        len=strlen(str);
        p=0;
        for(i=0; i<len; i++)
        {
            if(judge(str[i]))
            {
                if(str[i]>='A'&&str[i]<='Z')
                    str[i]=str[i]+('a'-'A');
                tmp[p++]=str[i];
            }
            else if(!judge(str[i])&&p>0)
            {
                tmp[p]='\0';
                mq[tmp]++;
                if(mq[tmp]>ans1||(mq[tmp]==ans1&&strcmp(tmp,ans)<=0))
                {
                    strcpy(ans,tmp);
                    ans1=mq[tmp];
                }
                p=0;
            }
        }

        if(p>0)
        {
            tmp[p]='\0';
            mq[tmp]++;
            if(mq[tmp]>ans1||(mq[tmp]==ans1&&strcmp(tmp,ans)<=0))
            {
                strcpy(ans,tmp);
                ans1=mq[tmp];
            }
        }

        cout<<ans<<" "<<ans1<<endl;
    }
    return 0;
}

/*
Can1: "Can a can can a can?  It can!"
*/


1072:

给你居民个数n,加油站个数m,k条路径,加油站到居民距离不能超过的最大值d。

然后接下来给了k条路径。

题目让我们求在全部的加油站中找符合不超过d的加油站。

假设加油站不唯一,按顺序优先考虑以下三个条件:

1.居民最短距离最大的加油站。

2.到全部居民距离之和最小的。

3.编号最小的。


这个题目坑了非常久,没能AC,有两个case过不了,仅仅有22分。。。。

好累。。。

代码:

#include<iostream>
#include<cstdio>
#include<vector>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
const int maxn = 1e9;

int n,m,k,d;
//居民个数,候选加油站,多少条路,距离限制
int mp[1505][1505]; //存地图
int dis[1505]; //最短路
int visi[1505];

struct node
{
    int index;  //编号
    int sum;    //总距离
    int mi;     //最短的距离
};

int calnumber()
{
    char tmp[105];
    cin>>tmp;
    int ans=0,i;
    int len=strlen(tmp);
    if(tmp[0]=='G')
    {
        for(i=1;i<len;i++)
            ans=ans*10+(tmp[i]-'0');
        return ans;
    }
    else
    {
        for(i=0;i<len;i++)
            ans=ans*10+(tmp[i]-'0');
        return ans+m;
    }
}

void input()  //输入函数
{
    int i,j;
    for(i=0;i<1500;i++)
    {
        for(j=0;j<1500;j++)
        {
            if(i==j) mp[i][j]=0;
            else mp[i][j]=maxn;
        }
    }

    for(i=0;i<k;i++)
    {
        int p1=calnumber();
        int p2=calnumber();
        int weight;
        cin>>weight;
        mp[p1][p2]=mp[p2][p1]=weight;
    }
}

void dijkstra(int p)
{
    int i,j;
    for(i=0;i<=1500;i++)
    {
        dis[i]=maxn;
        visi[i]=0;
    }
    dis[p]=0;  //起始点

    for(i=1;i<=n+m;i++)
    {
        int cur,mi=maxn;
        for(j=1;j<=n+m;j++)   //从当前结点中找一个距离最小的。拿出来标记
        {
            if(!visi[j]&&dis[j]<mi)
            {
                mi=dis[j];
                cur=j;
            }
        }

        visi[cur]=1;
        for(j=1;j<=n+m;j++)
        {
            if(dis[j]>dis[cur]+mp[cur][j])
                dis[j]=dis[cur]+mp[cur][j];
        }
    }
}

int main()
{
    int i,j;
    int flag;
    while(cin>>n>>m>>k>>d)
    {
        flag=0;  //flag=1表示已经有满足要求的station了
        input();

        node ans;
        for(i=1;i<=m;i++)
        {
            dijkstra(i);
            int tot=0,mi=maxn,ma=0;
            for(j=m+1;j<=m+n;j++)   //仅仅计算house的距离
            {
                if(mi>dis[j])
                    mi=dis[j];
                if(ma<dis[j])
                    ma=dis[j];
                tot+=dis[j];
            }

            if(ma>k) continue;  //超出服务范围

            if(flag==0)
            {
                ans.index=i;
                ans.sum=tot;
                ans.mi=mi;
                flag=1;
            }
            else
            {
                int q=0;   //q=1说明要更新
                if(mi>ans.mi)  //加油站越远越好
                    q=1;
                else if(mi==ans.mi&&tot<ans.sum)
                    q=1;
                else if(mi==ans.mi&&tot==ans.sum&&i<ans.index)
                    q=1;
                if(q)
                {
                    ans.index=i;
                    ans.sum=tot;
                    ans.mi=mi;
                }
            }

            //printf("G%d\n",ans.index);
            //printf("%.1f %.1f\n",(double)ans.sum/n,(double)ans.mi);
            //printf("%d\n",ans.ma);
            //printf("%d\n",ans.sum);
        }

        if(flag==0)
        {
            puts("No Solution");
            continue;
        }
        printf("G%d\n",ans.index);
        printf("%.1f %.1f\n",(double)ans.mi,(double)ans.sum/n);
    }
    return 0;
}

/*
4 3 11 5
1 2 2
1 4 2
1 G1 4
1 G2 3
2 3 2
2 G2 1
3 4 2
3 G3 2
4 G1 3
G2 G1 1
G3 G2 2

2 1 2 10
1 G1 9
2 G1 20
*/



版权声明:本文博主原创文章。博客,未经同意不得转载。

转载于:https://www.cnblogs.com/zfyouxi/p/4811477.html

相关文章:

  • Bootstrap轮播Carousel样式的应用
  • 第3.3 案例2: 工作队列 job queue
  • 根据新浪天气API获取各地天气状况(Java实现)
  • spring的学习
  • 网站通常使用一些javascript包裹 简化电话
  • 我的开始--大道至简的第一章
  • 学习一样新东西行而有效的方法 学习捷径 一项由10个步骤组成的学习方法
  • VS2010中汉字拷贝到Word出现乱码问题解决
  • hdu 5119 Happy Matt Friends (dp)
  • Json.Net系列教程 1.Json.Net介绍及实例
  • PHP 数据结构
  • JavaScript 三种创建对象的方法
  • Java虚拟机(JVM)中的内存设置详解
  • Remove Linked List Elements
  • typeof、offsetof、container_of的解释
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • Angular 4.x 动态创建组件
  • Node + FFmpeg 实现Canvas动画导出视频
  • oldjun 检测网站的经验
  • React+TypeScript入门
  • Solarized Scheme
  • SpiderData 2019年2月23日 DApp数据排行榜
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 利用jquery编写加法运算验证码
  • 聊一聊前端的监控
  • 少走弯路,给Java 1~5 年程序员的建议
  • 手写双向链表LinkedList的几个常用功能
  • 一些css基础学习笔记
  • Hibernate主键生成策略及选择
  • 函数计算新功能-----支持C#函数
  • 湖北分布式智能数据采集方法有哪些?
  • ​比特币大跌的 2 个原因
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • "无招胜有招"nbsp;史上最全的互…
  • # 安徽锐锋科技IDMS系统简介
  • #调用传感器数据_Flink使用函数之监控传感器温度上升提醒
  • #免费 苹果M系芯片Macbook电脑MacOS使用Bash脚本写入(读写)NTFS硬盘教程
  • $.ajax()
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (14)Hive调优——合并小文件
  • (42)STM32——LCD显示屏实验笔记
  • (附源码)spring boot公选课在线选课系统 毕业设计 142011
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (九)c52学习之旅-定时器
  • (生成器)yield与(迭代器)generator
  • (一)基于IDEA的JAVA基础12
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Java socket中关闭IO流后,发生什么事?(以关闭输出流为例) .
  • (转)shell中括号的特殊用法 linux if多条件判断
  • (转)visual stdio 书签功能介绍
  • .Net 垃圾回收机制原理(二)
  • .NET 设计模式初探