题目一 翻转数列
题目描述
小Q定义了一种数列称为翻转数列:
给定整数n和m,满足n能被2m整除。对于一串连续递增整数数列1,2,3,4…,每隔m个符号翻转一次,最初符号是’-‘。
例如n=8,m=2,数列就是 -1, -2, +3, +4, -5, -6 +7, +8
而n=4,m=1,数列就是-1, +2, -3, +4。
小Q现在希望你能帮他算算前n项和为多少。
输入描述:
输入包括两个整数n和m(2<=n<=10^9, 1 <= m),并且满足n能被2m整除。
输出描述:
输出一个整数,表示前n项和。
示例
输入
8 2
输出
8
代码
# include<iostream>
# include<vector>
# include<algorithm>
# include<string>
using namespace std;
int main(){
long long n, m;
while(cin>>n>>m){
long long result = (n >> 1) * m;
cout<<result<<endl;
}
}
题目二 小Q的歌单
题目描述
小Q有X首长度为A的不同的歌和Y首长度为B的不同的歌。现在小Q想用这些歌组成给一个总长度为K的歌单,每首歌最多只能在歌单中出现一次,在不考虑歌单内歌曲的先后顺序的情况下,请问有多少种组成歌单的方法?
输入描述
每个输入包含一个测试用例。
每个测试用例的第一行包含一个整数,表示歌单的总长度K(1<=K<=1000)。
接下来的一行包含四个正整数,分别表示歌的第一种长度A(A<=10)和数量X(X<=100)以及歌的第二种长度B(B<=10)和数量Y(Y<=100)。保证A不等于B。
输出描述
输出一个整数,表示组成歌单的方法取模。因为答案可能会很大,输出1000000007取模的结果。
示例
输入
5
2 3 3 3
输出
9
40%代码
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
int num = 0;
void deal_sum(vector<int>a, int n, int val)
{
int count = 1;
int m = n;
vector<int>b(n,0);
while (m--)
count *= 2;
while (count--){
for (int i = 0; i<n; i++){
if (0 == b[i])
b[i] = 1;
else
{
b[i] = 0;
break;
}
}
int sum = 0;
for (int i = 0; i<n; i++){
if (b[i] == 1)
sum += a[i];
}
if (sum == val)
{
num++;
}
}
}
int main() {
vector<int> arr;
int K;
cin >> K;
int A, X, B, Y;
cin >> A >> X >> B >> Y;
for (int i = 0; i<X; i++)arr.push_back(A);
for (int i = 0; i<Y; i++)arr.push_back(B);
deal_sum(arr,arr.size(),K);
cout << num%1000000007;
}
题目三 安排机器
题目描述
小Q的公司最近接到m个任务,第i个任务需要x的时间去完成,难度等级为yi。
小Q拥有n台机器,每台机器最长工作时间zi,机器等级wi。
对于一个任务,它只能交由一台机器来完成。如果安排给它的机器的最长工作时间小于任务需要的时间,则不能完成。如果完成这个任务将获得200*xi+2*yi 收益。
对于一台机器,它一天只能完成一个任务,如果它的机器等级小于安排给它的任务难度等级。则不能完成。
小Q想在今天尽可能的去完成任务,即完成的任务数量最大。如果有多种安排方案,小Q还想找到收益最大的那个方案。小Q需要你来帮助他计算一下。
输入描述
输入包括 N+M+1 行
输入的第一行为两个正整数n和m(1<=n,m<=100000),表示机器的数量和任务的数量。