1. 程式人生 > >2018年東北農業大學春季校賽 B

2018年東北農業大學春季校賽 B

連結:https://www.nowcoder.com/acm/contest/93/B
來源:牛客網

時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld

題目描述

給你一個n*n矩陣,按照順序填入1到n*n的數,例如n=5,該矩陣如下

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

現在讓你連線相鄰兩條邊的中點,然後只保留他們圍成封閉圖形區域的數字,那麼這個矩陣變為

3

7

8

9

11

12

13

14

15

17

18

19

23

現在你們涵哥讓你求變化後的矩陣的所有元素的和為多少

輸入描述:

輸入第一行一個整數T(1<=T<=100)
接下來有T組測試資料,每組測試資料輸入一個整數n(3<=n<=10000)
保證輸入的n為奇數

輸出描述:

對於每組測試資料,輸出對應答案

分析:m錯設為int型,ans+=m*k;時,是先將m*k再轉為longlong型賦給ans,所以int會在乘的時候越界。

程式碼如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<cmath>
#define ll long long
using namespace std;

int main(){
    int t,n;
    scanf("%d",&t);

    while(t--){
        ll ans=0;
        scanf("%d",&n);
        int k=1,flag=0;
        ll m=n/2+1;
        for(int i=1;i<=n;i++){
            ans+=m*k;
            m+=n;
            if(!flag)k+=2;
            else k-=2;
            if(k==n)flag=1;
        }
        printf("%lld\n",ans);
    }
}
時間限制:C/C++ 1秒,其他語言2秒
空間限制:C/C++ 262144K,其他語言524288K
64bit IO Format: %lld

題目描述

你們wyh學長給你n個點,讓你分成2個集合,然後讓你將這n個點進行兩兩連線在一起,連線規則是這樣的

1. 連線的兩個點必須在不同的兩個集合

2. 一個集合內部任意兩個點之間不能相連

現在,wyh學長需要讓你將這n個點任意分成2個集合之後,最多能連線多少條邊?

輸入描述:

輸入第一行一個整數T(1<=T<=100000)
接下來T組測試資料,每組測試資料輸入一個整數n(1<=n<=100000)

輸出描述:

對於每組測試資料,輸出對應答案

分析:m錯設成int型,ans=m*m;先把m*m再轉化成longlong型,賦給ans,所以m為int型時可能越界。

程式碼如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#define ll long long
using namespace std;

int main(){
    int t,n;
    ll ans;
    scanf("%d",&t);
    while(t--){
        scanf("%d",&n);
        ll m=n/2;
        if(n%2==0){
            ans=m*m;
        }
        else{
            ans=m*(m+1);
        }
        printf("%lld\n",ans);
    }

}

總結:與longlong型數運算的數,儘量也設成longlong型。