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