1. 程式人生 > >codeforce898E Squares and not squares (round #451 div 2)

codeforce898E Squares and not squares (round #451 div 2)

題目詢問將一組數變成一半為平方數,一半為非平方數 的最少步數。

初始化所有的平方值,注意要開到比1e9大的第一個數。

然後讀取,把所有值與其最近的平方數(lower_bound)之差push到一個優先佇列裡。

並統計平方數的個數S 和0的個數Z(因為0需要改變兩次才能到一個非平方數)。

然後根據S和Z判斷輸出,詳見程式碼。

#include <bits/stdc++.h>
using namespace std ;
typedef long long LL;

typedef long long ll ;
int arr[50000] ;

int init(){
    int n = 0 , i = 0;
    while(n * n <= 1e9){
        arr[i ++] = n * n ;
        n ++ ;
    }
    arr[i++] = n * n ;
    return i ;
}
const int maxn = 200005 ;
int s[maxn] ;
priority_queue<int , vector<int> , greater<int> > pq ;
int main(){
    int len = init() ;
    int n , temp ;
    while(~ scanf("%d" , &n)){
        while(!pq.empty()) pq.pop() ;
        int sqnum = 0 ,zeronum = 0 ;
        for(int i = 0 ; i < n ; i ++ ){
            scanf("%d" , &s[i]) ;
            int t = upper_bound(arr , arr + len , s[i]) - arr ;
            //cout << arr[t - 1] << " " << arr[t] << endl ;
            if(s[i] == 0 ) zeronum ++ ;
            if(s[i] == arr[t-1] || s[i] == arr[t]) sqnum ++ ;
            else {

                temp = min(s[i] - arr[t-1] , arr[t] - s[i] ) ;
                //cout << temp << endl ;
                pq.push(temp ) ;
            }
        }
        if(sqnum <= n / 2){

            int num = n / 2 - sqnum ;
            //cout << num << endl ;
            int temp ;
            ll ans = 0 ;
            for(int i = 1 ; i <= num ; i ++ ){
                temp = pq.top() ; pq.pop() ;
                ans += (ll)temp ;
            }
            printf("%lld\n" , ans) ;
        }else{
            if(zeronum <= n / 2)
                printf("%d\n" , sqnum - n / 2 ) ;
            else{
                printf("%d\n" , zeronum - n / 2 + sqnum - n / 2) ;
            }
        }
    }
    return 0 ;
}

相關推薦

codeforce898E Squares and not squares round #451 div 2

題目詢問將一組數變成一半為平方數,一半為非平方數 的最少步數。 初始化所有的平方值,注意要開到比1e9大的第一個數。 然後讀取,把所有值與其最近的平方數(lower_bound)之差push到一個優先佇列裡。 並統計平方數的個數S 和0的個數Z(因為0需要改變兩次才能到

Codeforces 1099 B. Squares and Segments-思維(Codeforces Round #530 (Div. 2))

index red decide flag header exist raw cin cond B. Squares and Segments time limit per test 1 second memory limit per

Codeforces 898E Squares and not squares

方案 def mar 最優解 time 偶數 轉化 問題 $1 題目大意 給定 $n$($n$ 是偶數,$2\le n\le 2\times 10^{5}$)個非負整數 $a_1,\dots, a_n$($a_i\le 10^9$)。 要求將其中 $n/2$ 個數變成平方數

A. The Fair Nut and Elevator Codeforces Round #526 (Div. 2)

A. The Fair Nut and Elevator 好笨啊QAQ。 暴力列舉的題,連分類都不用。 從電梯初始位置到第一層、人到第一層、間隔的層數,往返路程。 #include <bits/stdc++.h> using namespace std; int

D. Ehab and another another xor problemCodeforces Round #525 (Div. 2)(互動題)

傳送門 題意:這是個互動題,題意是這樣的,現在不知道a,b的值,但是有三種操作, 然後每次問完問題,也就是你輸出你的c和d,互動系統會給出相應的值(1/0/-1),然後你最多可以問62個問題,最後確定出這個a和b是多少?資料範圍: 題解:要想確定a和b的值,況且a,b的範圍最多是3

【Codeforces Round #451 (Div. 2) D】Alarm Clock

force alarm cnblogs bit any inpu size class long long 【鏈接】 我是鏈接,點我呀:) 【題意】 在這裏輸入題意 【題解】 尺取法+二分。 類似滑動窗口。 即左端點為l,右端點為r. 維護a[r]-a[l]

Codeforces Round #451 (Div. 2) F Restoring the Expression

rest strlen int() 開頭 都是 ret 代碼 += code 題意: 有一個a+b=c的等式,去掉兩個符號,把三個數連在一起得到一個數 給出這個數,要求還原等式,length <= 1e6 三個數不能含有前導0,保證有解 解法: 鐵頭過題法,分類然

Codeforces Round #451 Div. 2 C D E

eve == ont span har else const 實用 iterator C。Phone Numbers 之前沒有做過字典樹……感覺這個題字典樹也能做……就拿來練一練字典樹……板子好多地方寫的都不夠好,還需要繼續改…… emmm這個……卡了好久啊……不過好在還

小蒟蒻初次CF滾粗+爆炸記 Codeforces Round #466 Div.2

.cn reg tex cor using AI printf 刪掉 ref 比賽鏈接:http://codeforces.com/blog/entry/57981 小蒟蒻今天初次在ZCDHJ張大佬的帶領下,打了一場CF (張大佬cnblogs鏈接:https://ww

E. Mahmoud and Ehab and the function Codeforces Round #435 (Div. 2)

its sum lse urn const tdi while The cst http://codeforces.com/contest/862/problem/E 二分答案 一個數與數組中的哪個數最接近: 先對數組中的數排序,然後lower_bound 1 #inc

C - Ilya And The Tree Codeforces Round #430 (Div. 2)

ret vector lis algo node main .com algorithm style http://codeforces.com/contest/842/problem/C 樹 dp 一個數的質因數有限,用set存儲,去重 1 #include

CA Loves StickBestCoder Round #78 (div.2)

CA Loves Stick Accepts: 381 Submissions: 3204 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others) 問題描述 CA

Codeforces Round #512 (Div. 2B.Vasya and Cornfield

B. Vasya and Cornfield time limit per test 1 second memory limit per test 256 megabytes

Codeforces Round #371 (Div. 2C. Sonya and Queries

C. Sonya and Queries time limit per test 1 second memory limit per test 256 megabytes input s

Codeforces Round #433 (Div. 2

bre lan include pty lap hide priority 現在 blank 題目鏈接:Codeforces Round #433 (Div. 2) codeforces 854 A. Fraction【水】 題意:已知分子與分母的和,求分子小於分母的

Codeforces Round #365 (Div. 2) D - Mishka and Interesting sum離線樹狀數組

turn string 之前 algorithm printf ace r++ void contest http://codeforces.com/contest/703/problem/D 題意: 給出一行數,有m次查詢,每次查詢輸出區間內出現次數為偶數次的數字的異

[Codeforces Round #261 (Div. 2) E]Pashmak and GraphDp

solution and other main ems scanf homework max urn Description Pashmak‘s homework is a problem about graphs. Although he always tries

博弈sg Codeforces Round #417 (Div. 2) E Sagheer and Apple Tree

paths 相同 friend pri 產生 chan star ren have Sagheer is playing a game with his best friend Soliman. He brought a tree with n nodes numbered

Codeforces Round #432 (Div. 2) D. Arpa and a list of numbers暴力

esp for int ans logs and codeforce style inf 枚舉質數,判斷是否超過臨界值。臨界值就是將不是因子中不含這個素數的數的個數乘以x和y的較小值,是否小於當前最小值。 #include <algorithm> #inclu

Codeforces Round #435 (Div. 2) E. Mahmoud and Ehab and the function預處理+二分

class [1] can 行處理 long 個數 分享 amp abs 題目鏈接:點我點我 題意:公式:,給出n個數,從a[1]到a[n],和m個數(b數組),然後從b數組裏挑出連續的n個數(也就m-n+1中選擇),按公式計算,使得f最小, 還有q次對a數組的操作(某