度小满 编程题交流分享

第一题没太读懂题,没写,下来整理思路代码
关键平局情况: 只有一个盒子,一直放球,会一直循环下去,即判断为平局
直觉可能会超时
第二题91%  超时
思路,两层循环,具体看代码

求大佬更好的思路

有一天,小A和小B玩了一个神奇的游戏,游戏开始时,桌面上有a0个不同盒子和b0个不同的物品,每个回合,两个人可以选择增加一个新的盒子或者一个新的物品(所有物品和盒子都不同),记当前桌子上的盒子数量为a,物品数量为b,当把b个物品放入a个盒子的方案数不小于n时,游戏结束,此时最后一位***作者判负。
给出a0,b0,n,如果小A先手,两个人都采用最优策略,谁能获胜,如果A获胜输出“A”,如果B获胜,输出“B”,如果是平局,输出“A&B”。

输入
输入第一行是一个数据组数T(T<=10)。
接下来T行,每行描述一个测试数据,包含三个整数a0,b0,n(1<=a0<=10000,1<=b0<=30,2<=n<=10^9)。分别表示桌子上初始的盒子数,球数和n值。

输出
对于每个测试数据,输出一行,仅包含一个字符串,即“A”,“B”或“A&B”。

样例输入
3
2 2 10
3 1 4
1 4 10

B
A
A&B

#include <stdio.h>
#include<cmath>
#include <iostream>
using namespace std;

using namespace std;
int main(){
    int T;
    cin>>T;
    int b,n;
    double a;

    for(int i = 0; i<T; i++){
        cin>>a>>b>>n;
        if(a==1){
            cout<<"A&B\n";
            continue;
        }
        double tmp,tmp1,tmp2;
        int count = 0;

        while(true){
            tmp1 = pow(a+1, b);
            tmp2 = pow(a, b+1);
            if(tmp1<tmp2){
                a = a+1;
                tmp = tmp1;
            }else{
                b = b+1;
                tmp = tmp2;
            }
            count++;
            if(tmp >= n || count >2){
                break;
            }
        }
        if(count %2 == 1){
            cout<<"A\n";

        }else{
            cout<<"B\n";
        }
    }
    return 0;
}


时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
n个点连成一条链,从左往右依次从1到n编号。相邻点之间有边相连,一共有n-1条边。所有的边从1到n-1编号,第i条边连接了点i和i+1。
第i个点有点权ai,定义第i条边的权重为wi:有多少点对x,y满足在第i条边的左侧(x≤i),y在第i条边的右侧(y>i),且x和y的点权不同。
给出每个点的点权,请求出所有边的边权。

输入
第一行输入一个数n。(2≤n≤100000)
第二行输入n个数,a1,a2,…,an (1≤ai≤109)

输出
输出n-1个数,依次为每条边的权重,不要在行末输出多余的空格。

样例输入
3
1 2 1
样例输出
1 1

#include <stdio.h>
#include <vector>
#include <iostream>
using namespace std;

int main(){
    int n;
    cin>>n;

    vector<int> a(n),w(n);
    for(int i=0; i<n; i++){
        scanf("%d",&a[i]);
    }

    for(int i=0; i<n-1; i++){
        for(int j=i+1; j<n; j++){
            if(a[j]!=a[i]){
                w[i]++;
                w[j]--;
            }
        }
        if(i!=0){
            w[i] = w[i]+w[i-1];
        }
        printf("%d ",w[i]);
    }

    return 0;
}




#笔试题目#
全部评论
请问一下第一题为什么count>2就break呢?
点赞 回复 分享
发布于 2019-04-28 22:09
两道题都懵逼
点赞 回复 分享
发布于 2018-09-27 00:43
关于第一题,我简要写了一点 https://github.com/Lost-Longinus/Recruitment/blob/master/%E5%BA%A6%E5%B0%8F%E6%BB%A1.md" 供您参考   倒是第二题,压根没看明白对于边权重的定义,麻烦您帮忙解释一下,谢谢!
点赞 回复 分享
发布于 2018-09-26 21:47
楼主,可以解释一下,第二题代码的思路吗
点赞 回复 分享
发布于 2018-09-26 21:26

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务