A题:
题意:第一行给出两个数n,m,第二行有n个数据,求最少需要多少个数使这几个数的和不小于m,并输出这几个数的从小到大位置。
思路:排序,选择最大的数,并输出。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define clr(a, v) memset( a , v , sizeof(a) )
#define pb push_back
#define mp make_pair
#define read(f) freopen(f, "r", stdin)
#define write(f) freopen(f, "w", stdout)
using namespace std;
const double pi = acos(-1);
struct node{
int val;
int num;
friend bool operator < ( const node& a, const node& b ){
return a.val < b.val;
}
}num[10005];
int main()
{
ios::sync_with_stdio( false );
int n, m;
while ( cin >> n >> m ){
clr ( num, 0 );
for ( int i = 0; i < n; i ++ ){
cin >> num[i].val;
num[i].num = i + 1;
}
sort ( num, num + n );
int cnt = -1;
for ( int i = 0; i < n; i ++ ){
if ( m >= num[i].val ){
m -= num[i].val;
cnt = i;
}
}
if ( cnt == -1 ){
cout << "0" << endl;
continue;
}
else{
cout << cnt + 1 << endl;
vector<int> tmp;
for( int i = 0; i <= cnt; i ++ ){
tmp.push_back( num[i].num );
}
sort ( tmp.begin(), tmp.end() );
cout << tmp[0];
for ( int i = 1; i < tmp.size(); i ++ ){
cout << ' ' << tmp[i];
}
cout << endl;
}
}
return 0;
}
B题:
题意:给出圆心坐标和圆的半径,以圆上某点旋转,求最少要几步将圆心能移动到指定坐标。
思路:求圆心坐标和指定坐标的距离,求倍数的上界
#include <iostream> #include <cstdio> #include <string> #include <cstring> #include <vector> #include <deque> #include <list> #include <cctype> #include <algorithm> #include <climits> #include <queue> #include <stack> #include <cmath> #include <map> #include <set> #include <iomanip> #include <cstdlib> #include <ctime> #define ll long long #define ull unsigned long long #define all(x) (x).begin(), (x).end() #define clr(a, v) memset( a , v , sizeof(a) ) #define pb push_back #define mp make_pair #define read(f) freopen(f, "r", stdin) #define write(f) freopen(f, "w", stdout) using namespace std; const double pi = acos(-1); int main() { ios::sync_with_stdio( false ); double n; double x_1, x_2, y_1, y_2; while ( cin >> n >> x_1 >> y_1 >> x_2 >> y_2 ){ n *= 2; double ans = sqrt ( ( x_1 - x_2 ) * ( x_1 - x_2 ) + ( y_1 -y_2 ) * ( y_1 - y_2 ) ); ans = ( ans + n - 0.0000001 ) / n; cout << (int)ans << endl; } return 0; }
C题:
题意:每棵树有n层,从根结点(第0层)按LRLRLR的顺序深搜遍历,第n层的第m个节点是第几个遍历到的节点
思路:先自底向上判断路径方向,若为奇数,则是L路径,若为偶数,为R路径,再从顶层开始判断,求是否为正常路径,如果是正常路径,则到下一层(第i层)节点,并且序号+1,若不是正常路径,则序号+(2^(n-i))+1,一直到目标节点。输出结果。
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <vector>
#include <deque>
#include <list>
#include <cctype>
#include <algorithm>
#include <climits>
#include <queue>
#include <stack>
#include <cmath>
#include <map>
#include <set>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#define ll long long
#define ull unsigned long long
#define all(x) (x).begin(), (x).end()
#define clr(a, v) memset( a , v , sizeof(a) )
#define pb push_back
#define mp make_pair
#define read(f) freopen(f, "r", stdin)
#define write(f) freopen(f, "w", stdout)
using namespace std;
const double pi = acos(-1);
int main()
{
ios::sync_with_stdio( false );
ll m, n;
while ( cin >> m >> n ){
ll tmp = 1;
ll ans = 0;
for ( int i = 0; i < m; i ++ ){
tmp *= 2;
}
char s[1000];
tmp --;
tmp += n;
n = tmp;
m ++;
ans = 1;
ll num = 0;
tmp = n;
while ( tmp > 1 ){
if ( tmp & 1 ){
s[num++] = 'R';
}
else{
s[num++] = 'L';
}
tmp /= 2;
}
s[num] = '\0';
char ch = 'L';
for ( ll i = num - 1; i >= 0; i -- ){
if ( ch == s[i] ){
ans ++;
if ( ch == 'L' ) ch = 'R';
else ch = 'L';
}
else{
tmp = 1;
for ( ll j = 0; j < m - ( num - i ); j ++ ){
tmp *= 2;
}
tmp -= 1;
ans += tmp;
ans ++;
}
}
cout << ans - 1 << endl;
}
return 0;
}
D题:
E题:
(未完待续)