2018年東北農業大學春季校賽 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型。