两道水题

昨天同桌为我推荐了p1904这道水题,然后他就写不出来了……本来不想写,但是看他写得很麻烦,为了给他展示我的代码能力就写了一下。

  即使类型为“其他”,但还是掩盖不了模拟的事实。那么直接sort Ai,再在前k个牛中找到Bi最高的就行。复杂度为N*logN+k

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
using namespace std;
struct woc
{
    int a;
    int b;
    int num;
}cow[50010];
bool mycmp(woc x,woc y)
{
    return x.a>y.a;
}
int n,k,i,ans=1;
int main()
{
ios::sync_with_stdio(false);
    cin>>n>>k;
    for(i=1;i<=n;i++)
    {
        cin>>cow[i].a>>cow[i].b;
        cow[i].num=i;
    }
    sort(cow+1,cow+1+n,mycmp);
         for(i=2;i<=k;i++)
    {
        if(cow[i].b>cow[ans].b)
            ans=i;
    }
    cout<<cow[ans].num;
        return 0;
}  

  往上看了一眼,p1903好像也挺简单。

如果双重循环应该是要超时的,n=20000,说小不小了。他们说要sort后二分,哇二分,代码有点复杂的,决心想一种简单点的方法。好像s也不大,我决定搞一个计数排序。

#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
using namespace std;
int i;
int num[1000010],t,n,s,ans,sum[1000010];
int C[10010];
int main()
{
ios::sync_with_stdio(false);
    cin>>n>>s;
    for(i=1;i<=n;i++)
    {
        cin>>t;
        num[t]++;
    }
    for(i=1;i<=10000;i++)C[i+1]=C[i]+i;
    for(i=1;i<=s;i++)
        sum[i]=sum[i-1]+num[i];

    for(i=1;i<=s/2;i++)
        ans+=C[num[i]]+num[i]*(sum[s-i]-sum[i]);
    cout<<ans;
return 0;
}

整个看下来复杂度是10000+s*3/2,完全没问题。

思路就是找到n头牛的长度对应的长度后num++,建立起一个前缀和(可能叫这玩意?)sum,以后方便算出i到s-i牛的数量,然后答案就是从num[i]中挑两个的方案数(C[num[i]]即为所求)加上num[i]*(sum[s-i]-sum[i]),输出。

原文地址:https://www.cnblogs.com/qywyt/p/9002299.html

时间: 2025-01-31 01:18:36

两道水题的相关文章

Co-prime Array&amp;&amp;Seating On Bus(两道水题)

Co-prime Array Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 660A Description You are given an array of n elements, you must make it a co-prime array in as few moves as possible. In ea

数论——异或,两道水题。

第一题:(没有链接) 题目大意:给你n个数(n <= 1000000),第i个数用ai表示(每个a <= 1000000),求出每个数与其之后的数的xor和. 举个例子吧,比如三个数1 2 3答案就应该为1 xor 2 + 1 xor 3 + 2 xor 3 = 4; 题解: 首先有一个O(n*n)的算法,就是暴力枚举,可以过40%数据. 程序大体: for (int i = 1;i < n;i ++) for (int j = i + 1;j <= n;j ++) ans +=

两道水题(月之数)(排序)

月之数 Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) : 32   Accepted Submission(s) : 22 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 当寒月还在读大一的时候,他在一本武林秘籍中(据后来考证,估计是计算

POJ百道水题列表

以下是poj百道水题,新手可以考虑从这里刷起 搜索1002 Fire Net1004 Anagrams by Stack1005 Jugs1008 Gnome Tetravex1091 Knight Moves1101 Gamblers1204 Additive equations 1221 Risk1230 Legendary Pokemon1249 Pushing Boxes 1364 Machine Schedule1368 BOAT1406 Jungle Roads1411 Annive

大数--几道水题,用来学学JAVA

几道水题,练习一下JAVA写大数 poj2305  Basic remains 大数可以直接用非十进制读入,读入的数在变量中是十进制的 输出的时候要先用BigInteger的toString方法转换为相应的进制 1 import java.math.*; 2 import java.util.*; 3 class Main 4 { 5 public static void main(String[] args) 6 { 7 Scanner cin = new Scanner(System.in)

逛园子,看到个练习题,小试了一把(淘宝ued的两道小题)

闲来无事,逛园子,充充电.发现了一个挺有意思的博文,自己玩了一把. 第一题:使用 HTML+CSS 实现如图布局,border-widht 1px,一个格子大小是 60*60,hover时候边框变为橘红色(兼容IE6+,考虑语义化的结构) 效果图: 简单分析一下: 使用伪类 :hover的时候相对定位 改变z-index, 代码如下: 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta c

刷了500道水题是什么体验?

并没有什么卵用. 我马上大二了,大一两学期目测切了1000道水题了,毫无意义. 至今不理解kmp和后缀数组,只会模板.数论和博弈论是什么?能吃吗?只会打表.图论至今不会tarjan,话说dlx是什么?插头dp,这是什么?数据结构还好,经常做高中生的题,可持久化可持久化线段树也能花一下午时间写出来,然而并不会考. 平时做题只刷水题,遇到难题的时候,随手搜题解,看了看,哇,这居然能这么搞!然后抄一遍别人代码,交上去ac. cf一年几乎没缺过,花了大一上半年时间才滚上div1.然而至今紫号一堆,黄名一

1503171912-ny-一道水题

一道水题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 今天LZQ在玩一种小游戏,可是这游戏数有一点点的大,他一个人玩的累.想多拉一些人进来帮帮他.你能写一个程序帮帮他吗?这个游戏是这种:有一行数字,假设我们把这行数字中的'5'都看成空格,那么就得到一行用空格切割的若干非负整数(可能有些整数以'0'开头,这些头部的'0'应该被忽略掉,除非这个整数就是由若干个'0'组成的,这时这个整数就是0). 你的任务是:对这些切割得到的整数,依从小到大的顺序排序输出,大家赶

两道递推公式题的解题报告

T1(阿牛的EOF牛肉串) 题意:一串由EOF三个字母组成的长度为\(n\)的字母串,不能出现连续的OO,求字符串种类数\(f[n]\) 答案:\(f[n]=2f[n-1]+2f[n-2]\) --① 注解: 如果a[n]取E,该情况下种类为f[n-1]: 如果a[n]取F,该情况下种类为f[n-1]; 如果a[n]取O,则只能取a[n-1]为E或F,分别有f[n-2]种. 综上,一共有f[n-1]+f[n-1]+f[n-2]+f[n-2]种. T2 (原题找不到了,恳请见过的巨佬提供线索) 题