牛家村的货币是一种很神奇的连续货币。
他们货币的最大面额是n,并且一共有面额为1,面额为2.....面额为n,n种面额的货币。
牛牛每次购买商品都会带上所有面额的货币,支付时会选择给出硬币数量最小的方案。
现在告诉你牛牛将要购买的商品的价格,你能算出牛牛支付的硬币数量吗? (假设牛牛每种面额的货币都拥有无限个。)
输入格式
共一行,包含两个整数n和m,分别表示货币的最大面额以及商品的价格。
输出格式
一个整数表示牛牛支付的硬币数量。
数据范围
1≤n≤1051≤n≤105,
1≤m≤1091≤m≤109
输入样例1:
6 7
输出样例1:
2
输入样例2:
4 10
输出样例2:
3
这是一道简单的贪心题目
#include
int main()
{
int n, m;
std::cin >> n >> m;
if (n >= m) {
std::cout << 1 << std::endl;
}
else {
if (m%n == 0)
std::cout << m / n << std::endl;
else
std::cout << m / n + 1 << std::endl;
}
}
妞妞最近迷上了王者荣耀。
小Q得到了一个奇妙的数列,这个数列有无限多项,数列中的第 i 个数字为i∗(−1)ii∗(−1)i,比如数列的前几项为-1,2,-3,4,-5…
小Q兴奋把这个数列拿去给妞妞看,并希望借此邀请妞妞吃饭。
妞妞想了想,对小Q说:“对于这个数列,我每次询问你一个区间,你在1秒内把这个区间里的数字的和告诉我,如果你答得上来我就跟你一起去吃饭。”
由于妞妞最近沉迷王者荣耀,已经很久都没理过小Q了,所以小Q不想失去这次珍贵的机会,你能帮帮他吗?
输入格式
第一行,一个整数 q,表示妞妞的询问次数。
接下来 q 行,每行两个整数 l 和 r,表示妞妞询问的区间的左端点和右端点。
输出格式
共 q 行,每行一个整数,表示妞妞询问的区间和。
数据范围
1≤q≤1051≤q≤105,
1≤l≤r≤1091≤l≤r≤109
输入样例1:
4
2 4
2 2
3 3
1 5
输出样例1:
3
2
-3
-3
输入样例2:
1
1 1000000000
输出样例2:
500000000
这是一道特殊性的题目,充分利用题目的特殊性解答,注意这里下标是从1开始的,与熟悉的习惯不同,需要仔细调试程序解答
#include
int main()
{
int K;
std::cin >> K;
while (K--) {
int l, r, res;
std::cin >> l >> r; // -1 2 -3 4 -5
if (l % 2) // l=2 r=4
res = (r - l + 1) / 2;
else {
res = (r - l + 1) / 2;
res = res * -1;
}
//std::cout << res << std::endl;
if ((r - l + 1) % 2 == 1) {
if (r % 2)
res += -r;
else
res += r;
}
std::cout << res << std::endl;
}
}
小Q和牛妹参加一个剪刀石头布的游戏,游戏用卡片来玩,每张卡片是剪刀,石头,布中的一种,每种类型的卡片有无限个。
牛妹从中选了n张卡片排成一排,正面朝下,小Q也会选择n张卡片排成一排,然后小Q和牛妹的卡片会依次进行比对,第一张对第一张,第二张对第二张…
如果小Q赢,小Q会得到一分,现在已知牛妹的每一张牌以及小Q最终的得分 s,请问小Q有多少种选择卡片的方案(多少不同的排列)
输入格式
第一行包含两个整数 n 和 s。
第二行包含 n 个整数,表示牛妹的每张卡片,每个数在[0,2]之间,0代表石头,1代表布,2代表剪刀。
输出格式
输出一个整数,表示总方案数对109+7109+7取模后的值。
数据范围
1≤n≤20001≤n≤2000,
0≤s≤20000≤s≤2000
输入样例:
3 2
0 1 2
输出样例:
6
小Q在进行射击气球的游戏,如果小Q在连续T枪中打爆了所有颜色的气球,将得到一只QQ公仔作为奖励。(每种颜色的球至少被打爆一只)。
这个游戏中有m种不同颜色的气球,编号1到m。
小Q一共有n发子弹,然后连续开了n枪。
小Q想知道在这n枪中,打爆所有颜色的气球最少用了连续几枪?
输入格式
第一行包含两个整数n和m。
第二行包含n个整数,分别表示每一枪打中的气球的颜色,0表示没打中任何颜色的气球。
输出格式
一个整数表示小Q打爆所有颜色气球用的最少枪数。
如果小Q无法在这n枪打爆所有颜色的气球,则输出-1。
数据范围
1≤n≤1061≤n≤106,
1≤m≤20001≤m≤2000
输入样例:
12 5
2 5 3 1 3 2 4 1 0 5 4 3
输出样例:
6
样例解释
有五种颜色的气球,编号1到5。
游客从第二枪开始直到第七枪,这连续六枪打爆了5 3 1 3 2 4这几种颜色的气球,包含了从1到5的所有颜色,所以最少枪数为6。
最后一道题目是一道双指针滑窗的题目,第一个指针先放在开头,第二个指针从开头遍历到末尾,只有在满足条件的情况下才能移动第一个指针。
这里要注意,这题目有一些特殊性,就是范围恰好是1-m,除了0之外的。所以要注意0的排除,另外判断条件成立用一个num变量,判断num==m即可
#include
using namespace std;
const int N = 1000010, M = 2010;
int arr[N], mp[M];
int main()
{
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
scanf("%d", &arr[i]);
bool flag = false;
int res = n + 1;
int colors = 0;
int j = 0; // j是前一个指针
// i是后一个指针
for (int i = 0; i < n; i++) {
if (arr[i]>0 && mp[arr[i]]==0)
colors++;
mp[arr[i]]++;
if (colors == m) {
flag = true;
while (arr[j] == 0 || mp[arr[j]] > 1) {
mp[arr[j]]--;
j++;
}
res = (i - j + 1 > res ? res : i - j + 1);
}
}
if (flag)
cout << res << endl;
else
cout << -1 << endl;
}