Codeforces Round #654 (Div. 2) [B - Magical Calendar] 题解

    技术2022-07-12  73

    [原题传送门]

    题意

    Alice有很多种日历,这些日历的不同之处在于一周的天数不一样(即日历的宽度不同),Alice想要从日历的某一天开始用记号笔连续画n天,而她拥有宽度1到r的日历,且每一种都有无穷本,请问Alice可以画出几种形状?

    思路

    通过小规模穷举可以发现: 在宽度小于n的日历中,在每种日历上可以涂鸦出的形状的个数都是该种日历的宽度 如:当Alice要画4天 宽度为1的日历所画出来的形状为列数为1行数为n的长方形,一种形状 宽度为2的日历所画出来的形状有以下两种

    宽度为3的日历所画出来的形状有以下三种 当使用宽度大于等于n的日历时,所涂鸦的形状都是行数为1、列数为n的长方形,

    所以r>=n时,可以画出1+2+……+n-1+1种形状,即n/2*(n-1)+1种当r<n时,则可以画出1+2+……+n种形状,即(1+n)/2*n种

    输入

    输入由多个测试用例组成。第一行包含单个整数t(1≤t≤1000)——测试用例的数量。接下来的t行包含测试用例的描述。

    对于每个测试用例,只有一行包含两个整数n,r(1≤n≤109,1≤r≤109)。

    输出

    对于每个测试用例,打印一个整数-问题的答案。

    my Accepted code

    #include <algorithm> #include <cmath> #include <cstdio> #include <cstdlib> #include <cstring> #include <fstream> #include <iostream> #include <map> #include <queue> #include <set> #include <stack> #include <string> #define ll long long #define db double #define inf INT_MAX #define s(a, n) memset(a, n, sizeof(a)) #define rep(l, a, b) for (ll l = a; l < b; ++l) #define per(l, a, b) for (ll l = a; l >= b; --l) #define debug(a) cout << '#' << a << '#' << endl using namespace std; bool fi = true; const unsigned long long MOD = 1e9 + 7; int main() { ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); int t; cin >> t; while (t--) { db n, r; cin >> n >> r; ll ans = 0; if (n > r) { ans = (1 + r) / 2.0 * r; cout << ans << endl; } else { ans = n / 2.0 * (n - 1); cout << ans + 1 << endl; } } }

    Processed: 0.008, SQL: 9