A题。。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 8 using namespace std; 9 10 #define LL long long11 #define eps 1e-812 #define inf 0x3f3f3f3f13 #define lson l, m, rt << 114 #define rson m+1, r, rt << 1 | 115 #define mnx 50016 17 struct node{18 int v, id;19 bool operator < ( const node &b ) const {20 return v < b.v;21 }22 }a[mnx];23 int b[mnx];24 int main(){25 int n, k;26 scanf( "%d %d", &n, &k );27 for( int i = 1; i <= n; ++i ){28 scanf( "%d", &a[i].v );29 a[i].id = i;30 }31 sort( a + 1, a + 1 + n );32 int i = 1, ans = 0, sum = 0;33 while( sum + a[i].v <= k && i <= n ){34 b[ans++] = a[i].id, sum += a[i++].v;35 }36 printf( "%d\n", ans );37 for( i = 0; i < ans; ++i )38 printf( "%d ", b[i] );39 return 0;40 }
B题。。注意有可能 爆int
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 8 using namespace std; 9 10 #define LL long long11 #define eps 1e-812 #define inf 0x3f3f3f3f13 #define lson l, m, rt << 114 #define rson m+1, r, rt << 1 | 115 #define mnx 50016 17 int main(){18 double r, x, y, xx, yy;19 scanf( "%lf%lf%lf%lf%lf", &r, &x, &y, &xx, &yy );20 double dis = sqrt( ( xx - x ) * ( xx - x ) + ( yy - y ) * ( yy - y ) );21 int ans = ceil( dis / 2 / r );22 cout << ans << endl;23 }
C题。。把它当做一棵满二叉树来看,根节点是1,然后第二层是2,3, 第三层是4,5,6,7。。先计算出第h层第n个节点在整个满二叉树是第cur个,然后一直向上得到父亲节点,一直到根节点。。计算的话,因为是LRLRLR这样走的,如果a[i+1] %2 == a[i]%2的话,就要加上某一边的子树的所有节点b[h+1-i],不同的话就直接ans++就好。。具体自己画图加结合代码理解一下
1 include2 #include 3 #include 4 #include 5 #include 6 7 using namespace std; 8 9 #define LL long long10 #define eps 1e-811 #define inf 0x3f3f3f3f12 #define lson l, m, rt << 113 #define rson m+1, r, rt << 1 | 114 #define mnx 50015 16 LL a[mnx], b[mnx];17 int main(){18 LL h, n;19 cin >> h >> n;20 LL L = 1;21 for( int i = 0; i < h; ++i )22 L <<= 1;23 b[0] = 1;24 for( int i = 1; i <= h; ++i )25 b[i] = b[i-1] * 2;26 LL cur = L + n - 1;27 int m = h + 1;28 while( cur ){29 a[m--] = cur;30 cur >>= 1;31 }32 LL ans = 0;33 for( int i = 1; i < h+1; ++i ){34 if( a[i+1] % 2 == a[i] % 2 )35 ans += b[h+1-i];36 else ans++;37 }38 cout << ans << endl;39
D题。。不会,数位dp,复制别人的题解
给定n,k,m
求有多少个恰好为n位的整数,且这个整数的某个后缀能整除k,答案模m
思路:
因为是求后缀,所以从低位往高位构造。
dp[i][j][0] 表示长度为i位的整数,模k结果为j,且不存在某个后缀能整除k的个数
dp[i][j][1] 表示长度为i位的整数,模k结果为j,且存在某个后缀能整除k的个数
然后转移就在某个状态前加一个数字,判断一下加上后能否被k整除来决定加上数字后到达的状态
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include
E题。。最短路,感觉挺水的,把最短路上所有为0的边改为1,把不是最短路的边所有为1的变为0。。
表示自己的代码写的好挫。。
1 #include2 #include 3 #include 4 #include 5 #include 6 #include 7 #include