Problem1: 输入两个数N,K。规定每一轮操作二选一, A: 所有数都减1;B: 所有数中把一个数拆分为两数之和,输入的初始数为N,总的拆分次数为K(这里注意,按照题目如果在一轮中拆了2个数,则次数算2),直到所有数为0, 计算所需轮数。
举例:
输入:9 3
输出:5
第一轮:拆9 变为【4,5】 ; 第二轮:拆5和4,变为【2,3,2,2】;第三轮:因为已经拆过3次了所以只能减,也就是减3次
最后拆2轮,减3轮,所需轮数为5轮。
#include <iostream>
#include <set>
#include <algorithm>
#include <cmath>
using namespace std;
int main ()
{
int n, k;
while( cin >> n >>k )
{
multiset<int, greater<int> > s; //按照降序排列
s.insert(n);
int splitLayer = 0, num = 0;
//cout << *s.begin() << endl;
for(int i= 0; i < k; ++i )
{
num += pow(2, i);
if( num >= k)
{
splitLayer = i + 1;
break;
}
}
while(k--)
{
int tmp = *s.begin();
s.erase( s.begin() );
s.insert( tmp / 2 );
s.insert( tmp - tmp / 2 );
}
int great = *s.begin();
int ans = splitLayer + great;
cout << ans << endl;
}
system("pause");
return 0;
}
Problem2: 输入N,表示数组的大小,再输入数组中的每一个数。N个村庄,若第i个数为正数a[i],表示该村庄需要卖出a[i]个苹果,如果为负数,表示需要购入a[i]个苹果。 将K个苹果运往相邻的村庄运费为K,求最终所有村庄平衡后(全为0),需要运费多少。
输入:
5
5 -3 1 1 -4
输出:
14
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
int main ()
{
int n; //村庄的数量
cin >> n;
vector<int> vec(n);
for( int i=0; i < n; ++i)
cin >> vec[i];
//cout << *vec.begin() << endl;
int p1, p2; //p1 指向第一个负数 p2指向第一个正数
int res = 0;
bool needMove = true;
while( needMove )
{
needMove = false; //注意这里是修改全局变量
for(int i=0; i < n; ++i)
{
if(vec[i] < 0)
{
p1 = i; needMove = true;
}
if(vec[i] > 0)
{
p2 = i; needMove = true;
}
}
if( abs(vec[p1]) >= abs(vec[p2]) ) // 如果负数的绝对值大
{
res += abs( vec[p2] ) * abs( p1 - p2 );
vec[p1] = vec[p1] + vec[p2];
vec[p2] = 0;
}
else
{
res += abs( vec[p1] ) * abs( p1 - p2 );
vec[p2] = vec[p1] + vec[p2];
vec[p1] = 0;
}
}
cout << "you need move:" << res << endl;
return 0;
}
Problem3: 输入N,K。N表示数组大小,然后输入数组中的数。 一个数组每次输出数组中最小的数,然后其他数减去这个最小数,重复这个过程K次。 其中 0<N, K <10^5, 0< a[i] < 10^9
举例:
输入:
4 3
2 6 4 3
输出:
2
1
1
#include <iostream>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
int main ()
{
int n, k;
cin >> n >> k;
vector<long long> arr(n);
for(int i=0; i<n; ++i)
{
cin >> arr[i];
}
int i=0, j=0;
cout << endl << "the expected output:" << endl;
while(k--)
{
sort(arr.begin() + i, arr.end()); //降序
long long tmp = arr[i];
cout << tmp << endl;
i++;
for( j = i; j < n; ++j )
{
arr[j] -= tmp;
}
}
return 0;
}