NOJ AC50记录

NOJ刷题总结

+++

HDU1969 Pie
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>

#define P acos(-1.0)

using namespace std;

const int N = 10010;

int n, f, a[N];

bool more_pie(double u)
{
    int cnt = 0;
    for(int i = 0; i < n; i++ )
        cnt += (int)(P * a[i] * a[i] / u);

    if(cnt >= f + 1) return true;
    else return false;
}

int main()
{
    int t;
    scanf("%d", &t);
    while(t--)
    {
        int res = 0;
        scanf("%d%d", &n, &f);
        for(int i = 0; i < n; i++ ){ scanf("%d", a + i); res = max(res, a[i]);}

        double L = 0, R = res * res * P;
        while(R - L >= 1e-6)
        {
            double mid = (L + R) / 2;
            if(more_pie(mid)) L = mid;
            else R = mid;
        }
        printf("%.4lf\n", R);
    }
    return 0;
}
HDU1087 super jump
//accode O(n2)
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 1010;
int a[N], dp[N];

int main()
{
    int m;
    while(cin >> m && m)
    {
        memset(dp, 0, sizeof dp);

        for(int i = 1; i <= m; i++ )
        {
            scanf("%d", a + i);
            dp[i] = a[i];
        }
        int res = a[1];

        for(int i = 2; i <= m; i++ )
            for(int j = 1; j < i; j++ )
                if(a[i] > a[j]) {dp[i] = max(dp[i], dp[j] + a[i]); res = max(res, dp[i]);}

        cout << res << endl;

    }
    return 0;
}
HDU1004
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>

#define x first
#define y second

using namespace std;

map<string,int>p;

int main()
{
    int n;
    while(scanf("%d",&n),n)
    {
        p.clear();

        string s;
        for(int i = 0; i < n; i++ )
        {
            cin >> s;
            p[s]++;
        }

        int max=0;
        string ss;
        for(auto u : p)
            if(u.y > max) {max = u.y; ss = u.x;}

        cout<<ss<<endl;
    }
    return 0;
}
HDU1728 迷宫(坑死人的bfs)

卡了好几个小时

本来觉得普通的宽搜加上每步都判断是否转弯可以ac,结果样例都一直过不去。

之后就转变思路,一次搜索一个方向的所有点,直到撞墙或者到达边界,然后把符合条件的加入队列。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>

using namespace std;

const int N = 105;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
char g[N][N];
int vis[N][N];
int m, n;
int k, x1, y1, x2, y2;
struct Node
{
    int x, y;
    int cur;
}ss, ee;

void bfs(int x, int y)
{
    memset(vis, 0, sizeof vis);
    queue<Node> q;

    vis[x][y] = 1;
    ss.x = x, ss.y = y, ss.cur = -1;
    q.push(ss);

    while(q.size())
    {
        ss = q.front();
        if(ss.cur >= k) break;
        q.pop();

        for(int i = 0; i < 4; i++ )
        {
            ee.x = ss.x + dx[i];
            ee.y = ss.y + dy[i];
            ee.cur = ss.cur + 1;

            while(ee.x >= 0 && ee.x < m && ee.y >= 0 && ee.y < n && g[ee.x][ee.y] == ‘.‘)
            {
                if(ee.x == x2 && ee.y == y2 && ee.cur <= k)
                {
                    cout << "yes" << endl;
                    return;
                }
                if(!vis[ee.x][ee.y])
                {
                    vis[ee.x][ee.y] = 1;
                    q.push(ee);
                }
                ee.x += dx[i], ee.y += dy[i];
            }
        }
    }
    cout << "no" << endl;
    return;
}

int main()
{
    int t;
    cin >> t;
    while(t--)
    {
        scanf("%d%d", &m, &n);
        for(int i = 0; i < m; i++ ) cin >> g[i];
        cin >> k >> y1 >> x1 >> y2 >> x2;
        y1--, x1--, y2--, x2--;

        bfs(x1, y1);
    }
    return 0;
}
UVA10375

分子分母数字个数相同

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int main()
{
    int p, q, r, s;
    while(cin >> p >> q >> r >> s)
    {
        double ans = 1;
        int i = 1, j = 1, x = p - q + 1, y = r - s + 1;
        for(; i <= q || j <= s;)
        {
            if(i <= q) ans *= (double)x++ / i++;
            if(j <= s) ans *= (double)j++ / y++;
        }
        printf("%.5f\n", ans);
    }
    return 0;
}
UVA133

参考紫书代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 25;
int a[N], m, n, k;

int go(int p, int d, int t)
{
    while(t--)
    {
        do
        {
            p = (p + d + n - 1) % n + 1;
        }while(a[p] == 0);
    }
    return p;
}

int main()
{
    while(cin >> n >> k >> m, n)
    {
        for(int i = 1; i <= n; i++ ) a[i] = i;
        int left = n;
        int p1 = n, p2 = 1;
        while(left)
        {
            p1 = go(p1, 1, k);
            p2 = go(p2, -1, m);
            printf("%3d", p1);
            left--;
            if(p2 != p1) printf("%3d", p2), left--;
            a[p1] = a[p2] = 0;
            if(left) printf(",");
        }
        cout << endl;
    }
    return 0;
}
NOJ1041

线段叉乘

if(min(x3, x4) > max(x1, x2)
    || min(x1, x2) > max(x3, x4)
    || min(y1, y2) > max(y3, y4)
    || min(y3, y4) > max(y1, y2))
        return false;

或者为了提高效率可以加上上面的代码,先粗略判断是否相交

#include <iostream>
using namespace std;
double x1, y1, x2, y2, x3, y3, x4, y4;
bool flag;
int main()
{
    while (cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3 >> x4 >> y4)
    {
        double fa = (y1 - y3) * (x4 - x3) - (x1 - x3) * (y4 - y3);
        double fb = (y2 - y3) * (x4 - x3) - (x2 - x3) * (y4 - y3);
        double fc = (y3 - y1) * (x2 - x1) - (x3 - x1) * (y2 - y1);
        double fd = (y4 - y1) * (x2 - x1) - (x4 - x1) * (y2 - y1);
        if ((fc * fd < 0) && (fa * fb < 0))
            flag = true;
        else
            flag = false;
        if (flag)
            cout << "yes" << endl;
        else
            cout << "no" << endl;
    }
    return 0;
}
  • 堆排序

NOJ1066
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int N = 100010;
int h[N], m, cnt, flag = 1;

void down(int u)
{
    int t = u;
    if(u * 2 <= cnt && h[u << 1] < h[t]) t = u << 1;
    if(u * 2 + 1 <= cnt && h[u << 1 | 1] < h[t]) t = u << 1 | 1;
    if(u != t)
    {
        swap(h[u], h[t]);
        down(t);
    }
}

int main()
{
    cin >> m;
    for(int i = 1; i <= m; i++ ) scanf("%d", h + i);
    cnt = m;

    for(int i = m >> 1; i; i--) down(i);

    while(m--)
    {
        if(flag)
        {   printf("%d", h[1]);
            flag = 0;
        }
        else
            printf(" %d", h[1]);
        h[1] = h[cnt--];
        down(1);
    }
    cout << endl;
    return 0;
}

原文地址:https://www.cnblogs.com/scl0725/p/12552104.html

时间: 2024-10-07 09:16:30

NOJ AC50记录的相关文章

老男孩Linux运维第41期20170917开班第四周学习重点课堂记录

第1章 必知必会文件 配置文件位置 该文件作用 /etc/sysconfig/network-scripts/ifcfg-eth0 第一块网卡的配置文件 同setup中的network /etc/resolv.conf 客户端DNS配置文件,优先级低于网卡配置文件 /etc/hosts 主要作用是定义IP地址和主机名的映射关系(域名解析),是一个映射IP地址和主机名的规定 /etc/sysconfig/network 用于配置hostname和networking /etc/fstab 开机自动

SSISDB8:查看SSISDB记录Package执行的消息

在执行Package时,SSISDB都会创建唯一的OperationID 和 ExecutionID,标识对package执行的操作和执行实例(Execution Instance),并记录operation message,统计executable的执行时间,便于developers 优化package的设计,对package进行故障排除. 一,在package发生错误时,查看失败的Executable An executable is a task or container that you

使用插件bootstrap-table实现表格记录的查询、分页、排序等处理

在业务系统开发中,对表格记录的查询.分页.排序等处理是非常常见的,在Web开发中,可以采用很多功能强大的插件来满足要求,且能极大的提高开发效率,本随笔介绍这个bootstrap-table是一款非常有名的开源表格插件,在很多项目中广泛的应用.Bootstrap-table插件提供了非常丰富的属性设置,可以实现查询.分页.排序.复选框.设置显示列.Card view视图.主从表显示.合并列.国际化处理等处理功能,而且该插件同时也提供了一些不错的扩展功能,如移动行.移动列位置等一些特殊的功能,插件可

Git 使用记录

在win7平台已经安装好了git的情况下: 1,Git 本地仓库建立与使用步骤: (2)新建立文件夹: $ mkdir learngit $ cd learngit $ pwd /Users/michael/learngit (1)引入git: 通过git init命令把这个目录变成Git可以管理的仓库: $ git init Initialized empty Git repository in /Users/michael/learngit/.git/ (3)添加文件:git add fil

前端学HTTP之日志记录

前面的话 几乎所有的服务器和代理都会记录下它们所处理的HTTP事务摘要.这么做出于一系列的原因:跟踪使用情况.安全性.计费.错误检测等等.本文将谥介绍日志记录 记录内容 大多数情况下,日志的记录出于两种原因:査找服务器或代理中存在的问题(比如,哪些请求失败了),或者是生成Web站点访问方式的统计信息.统计数据对市场营销.计费和容量规划(比如,决定是否需要增加服务器或带宽)都非常有用 可以把一个HTTP事务中所有的首部都记录下来,但对每天要处理数百万个事务的服务器和代理来说,这些数据的体积超大,很

ClientDataSet中动态添加计算字段并用计算字段显示记录的UpdateStatus

ClientDataSet中每条记录都有UpdateStatus=(usUnmodified, usModified, usInserted, usDeleted)记录该条数据是修改的,删除的,还是新增的等.有时候我们只想看修改的或新增的或删除的就可能用到这一属性.下图用计算字段显示UpdateStatus状态. ********************************************************************************************

MySQL删除重复记录的方法

参考网上的方法,总结了产出重复记录的方法,欢迎交流. 方法1:创建一个新表临时储存数据 假设我们有一个存在多个字段的表,表中有部分数据的若干字段重复,此时我们可以使用DISTINCT这个关键字对表数据进行筛选. 1 CREATE [TEMPORARY] TABLE temp LIKE origin_tb; 2 INSERT temp(attr1,attr2,...) SELECT DISTINCT attr1,attr2,... FROM origin_tb; 3 DELETE FROM ori

北塔网管软件BTSO2.5安装过程记录

北塔网管软件据说是同类比较好的,原来的BTIM系列好像停止更新了,用BTSO版本代替,叫智慧运维平台,据说有各种改进,先把安装过程记录下来,以备以后重装. BTSO分两个部分:平台服务器和注册服务器,可以安装到一台主机,也可以分开,他们要能够通讯,否则认为盗版,注册要记录系统环境.要识别原版光盘,反正国产的软件版权意识近乎变态. 说明上要求win2008r2ent中文版或者win2012企业中文版,先试了2012,注册菜单不出现,重新用2008安装.顺序如下: 1.安装BETA-BTSO_2.5

Python学习记录-2016-12-17

今日学习记录 模块: import os#导入os模块 import sys#导入sys模块 os.system("df -h")#执行df -h命令 cmd_res = os.popen("df -h").read()#将命令的返回结果赋值给cmd_res,如果不加入.read()会显示命令的返回加过在内存的位置 print(sys.path)#显示系统变量路径,一般个人模块位于site-packages下,系统模块位于lib下 print(sys.argu[2]