比赛链接:点这里
题目:
Problem A: pigofzhou的巧克力棒
Description
Input
输入数据为T组(T <= 10000),每组数据读入一个n(n<=1000000000)
Output
一行一个整数代表能获得的最大高兴值
Sample Input
Sample Output
思路:好吧,我承认这道题我做的复杂了。。时间复杂图太高,这道题和下一道题一模一样,甚至代码都不用改,但是我的这个代码交到B题会超时,规律是2的n次方的时候,是2的n次方减1
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int cifang(int n)//计算2的n次方
{
int sum=1;
while(n--)
{
sum*=2;
}
return sum;
}
int a[35];
int main()
{
int q=1;
for(int i=1; i<=30; i++)
{
a[q++]=cifang(i);
}//打一张表,2的0次方到2的30次方
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
int sum=0;
while(n>0)
{
if(n==1)
{
break;
}
for(int i=1; i<=30; i++)//循环2的次方数
{
if(n==a[i])//如果n恰好等于2的某一个次方
{
sum+=a[i]-1;//次数正好加上它-1
n-=a[i];//更新n的值
break;
}
if(n<a[i]&&n>a[i-1])//在2的n-1次方与2的n次方之间
{
sum+=a[i-1]-1;
n-=a[i-1];
}
}
}
printf("%d\n",sum);
}
return 0;
}
Problem B: Zhazhahe究竟有多二
Description
Zhazhahe竟然能二到把耳机扔到洗衣机里去洗,真的是二到了一种程度,现在我们需要判断一下zhazhahe二的程度(就是计算zhazhahe的脑残值有几个2的因子),下面给你一个n,n!表示zhazhahe的脑残值。
Input
输入一个正整数t(0<t<3000)表示样例组数,每组样例输入一个正整数n(0<n<1e18),n!表示zhazhahe的脑残值
Output
输出一个正整数表示zhazhahe二的程度
Sample Input
Sample Output
HINT
思路:仔细读题,会发现这道题和第一道题有什么区别,完全没有嘛。。,但是你用下面的代码交一下A题,然后就神奇的过了,
其实两道题的规律都是2的n次方的时候是2的n次方减1
#include<stdio.h>
int main()
{
long long int t;
scanf("%lld",&t);
while(t--)
{
long long int n,s=0;
scanf("%lld",&n);
while(n)
{
s+=n/2;
n/=2;
}
printf("%lld\n",s);
}
}
Problem C: 剁手女生节
Description
由于女生节准备到了,ming打算给班上女生送一份大礼。没错,就是数学练习册!
ming先前就已经收藏了 n 本练习册了,一直不舍得做,这次突然决定把它们都拿出来当作礼物送出去!
但是,ming班上一共有 4 个女生,为了不要显得自己偏爱哪一个,他觉得每个女生都应该分到同等数量的练习册。
这样的话,原来的 n 本就可能不太够了。于是他去逛亚马当商城。
他发现,最近ACM(Association of Counting Method)又出版了好多新版数学练习册:高数、线代、离散、概率论…
而且商店有三种促销优惠套餐:
第一种:任选 1 本练习册,送欧几里德主题套尺。只需 a 个比特币;
第二种:任选 2 本练习册,送莱布尼兹同款2B铅笔。只需 b 个比特币;
第三种:任选 3 本练习册,送爱因思坦专用橡皮擦。只需 c 个比特币。
那么问题来了:吃土ming如何用最少的比特币购买若干本练习册,使得全部(包括原来的n本)可以平分给四个女生?
Input
每组输入是一行四个整数:n,a,b,c(1 <= n,a,b,c <= 1e9)意思如题目描述。
Output
对每组输入,输出一行一个整数,表示ming要花的最少的比特币数。
Sample Input
Sample Output
思路:这道题一共三种情况,水过
代码:
#include<stdio.h>
#include <algorithm>
#define ll long long int
using namespace std;
int main()
{
ll t;
scanf("%lld",&t);
while(t--)
{
ll n,a,b,c;
scanf("%lld%lld%lld%lld",&n,&a,&b,&c);
if(n%4==0)
printf("0\n");
else
{
ll x=(4-(n%4));
if(x==1)printf("%lld\n",min(min(a,c*3),c+b));
if(x==2)printf("%lld\n",min(min(2*a,b),c*2));
if(x==3)printf("%lld\n",min(min(3*a,a+b),c));
}
}
return 0;
}
Problem D: 勤奋的涟漪2
Description
涟漪进入集训队后,他会去实验室训练或者去操场锻炼。 接下来n天,每天的情况是一下4种中的一种: 1.当天体育馆关门了和没有训练赛 2.当天体育馆关门了和有训练赛 3.当天体育馆开放和没有训练赛 4.当天体育馆开放和有训练赛 涟漪知道之后n天的情况。 涟漪每一天可以休息,或者打训练赛(当天有训练赛)或者运动(当天体育馆开放)。 涟漪要制定一个训练计划,决定每天干什么,但是涟漪不会连续两天都运动或者连续两天都打训练赛, 请帮涟漪找出她最少休息的天数(她不打训练赛和运动)。 休息的时候,她会做下面的数学题
Input
Output
输出 一个数 表示(涟漪休息的天数) 乘以(数学题的答案的积)。
Sample Input
Sample Output
代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int a[110];
int n;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=0; i<n; i++)
scanf("%d",&a[i]);
int sum=0;
for(int i=0; i<n; i++)
{
if(a[i]==3)//体育馆和训练赛都能参加
{
if(a[i-1]!=3)//如果上一天的状态不是都开门
a[i]=3-a[i-1];//转换状态
}
else
{
if(a[i]==a[i-1])
{
a[i]=0;//状态已经转换了,这一项和前一项相等时就标记为0
}
}
}
for(int i=0; i<n; i++)
{
if(a[i]==0)
sum++;
}
printf("%d\n",sum*(-24));
}
return 0;
}
/* **********************************
体育馆 训练赛 ***
0 0 0 ***
1 0 1 ***
2 1 0 ***
3 1 1 ***
** *********************************/
Problem E: 穷游中国在统题
Description
Input
Output
Sample Input
Sample Output
Problem H: 《为什么会变成这样呢》
Description
Input
Output
Sample Input
Sample Output
思路:注释就不写了把,应该都能看懂,用了队列,还好这个题只有两个不一样的。。
代码:
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <map>
#include <stack>
#include <queue>
#include <vector>
#include <algorithm>
#define mem(a,b) memset(a,b,sizeof(a))
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
queue<int>s;
int n;
int k;
scanf("%d",&n);
for(int i=0; i<n; i++)
{
scanf("%d",&k);
if(!s.empty())
{
if(k==s.front())
s.pop();
else
s.push(k);
}
else
{
s.push(k);
}
}
int a=s.front();
s.pop();
int b=s.front();
s.pop();
printf("%d %d\n",min(a,b),max(a,b));
}
return 0;
}
ps:至于F(输出ac),G(求组合数)有点水,就不在这贴上来了,J题直接打表,I题么。。这个不会做,它的后台数据有问题,随便交个代码都能过,也不能判断代码的正确性,就不弄了