度小满 编程题交流分享
第一题没太读懂题,没写,下来整理思路代码
关键平局情况: 只有一个盒子,一直放球,会一直循环下去,即判断为平局
直觉可能会超时
第二题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; }