CSDN的第一篇博客从此篇开始
作为一名小白第一次接近做出了ABC三题,感到很是高兴
接下来是正题:
A
A题不难,由于第二堆最先会被取完
所以很容易想到贪心的做法:
- 执行第二种方案,实现用第二堆最少的石头实现最多
- 执行第一种方案,把第一堆和有可能剩下的第二堆榨干
#include<iostream>
using namespace std;
int main(){
int n,a,b,c;
cin>>n;
int num;
for(int i=0;i<n;i++){
num=0;
cin>>a>>b>>c;
if(c/2>=b){
cout<<3*b<<endl;
}
else{
num+=(c/2)*3;
b-=num/3;
if(a>=b/2){
num+=(b/2)*3;
cout<<num<<endl;
}
else{
num+=a*3;
cout<<num<<endl;
}
}
}
return 0;
}
B
公式 (2m-1)n
考虑每一件礼物,它只可能装在第一个盒子里、第二个盒子里……
同时在第一个和第三个盒子里、同时在第二个和第三个盒子里……
一共2^m-1种
题目限时,所以需要用一个快速幂,可惜程序一直报错double不能转int64不知道为什么,最终没ac
(经检查,自定义函数名用了内置函数pow,但是我没用头文件cmath,这种情况也会使自定义函数无效吗?)
C
最后没多少时间了,粗粗看了一眼C
简单来收就是要求所有组里面能运水数量最小值的最大值
很显然是n2/2
以下转载外国友人的分析
而我把题目中的输入排序后找到了规律
于是
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
usingnamespace std;
int main()
{
int n;
cin>>n;
int a[305][305];
bool flag=true;
int sum=0;
for(int j=1;j<=n;j++){
if(flag){
for(int i=1;i<=n;i++){
sum++;
a[i][j]=sum;
}
}
else{
for(int i=n;i>=1;i--){
sum++;
a[i][j]=sum;
}
}
flag=!flag;
}
for(int i=1;i<=n;i++){
cout<<a[i][1];
for(int j=2;j<=n;j++){
cout<<' '<<a[i][j];
}
cout<<endl;
}
return0;
}