题目链接
/*
分析:首先我们知道n个饼总的需要烤的面数是2*n,每次我们最多可以烤k面,
所以烤的最小次数是2*n/k(整除时),或者2*n/k+1(不整除时,余数部分需要整体烤一次)
*/
#include
#include
#include
#include
using namespace std;
typedef long long ll;
int main()
{
int t;cin>>t;
while(t--){
int n,k;
scanf("%d%d",&n,&k);
if(n<=k){
printf("%d\n",2);
continue;
}
if(2*n%k!=0) printf("%d\n",2*n/k+1);
else printf("%d\n",2*n/k);
}
return 0;
}
/**************************************************************
Problem: 1196
User: MDZZhhh
Language: C++
Result: Accepted
Time:0 ms
Memory:1696 kb
****************************************************************/
/*
分析:把每一位加起来判断是否能够整除3即可。
*/
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 505;
char s[maxn];
int main()
{
int t;cin>>t;
while(t--){
scanf("%s",s);
int len=strlen(s);
int sum=0;
for(int i=0;i
/*
分析:按照题意写就行了
*/
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 505;
int main()
{
int t;cin>>t;
while(t--){
int a,b,sum=0;
for(int i=0;i<8;i++){
scanf("%d:%d",&a,&b);
sum+=a*60+b;
}
printf("%d\n",sum);
}
return 0;
}
/**************************************************************
Problem: 1198
User: MDZZhhh
Language: C++
Result: Accepted
Time:0 ms
Memory:1696 kb
****************************************************************/
有个小师妹找zhazhahe玩游戏。他们有一堆n个珠子,每人轮流拿走若干个,轮到谁的回合拿不了珠子就算输。给出一个n,每次能拿走的珠子数量在区间[l,r]内(如果剩余珠子不足就不能拿,判输),小师妹先开始拿。假设小师妹和zhazhahe都非常聪明,会采取最优策略,问谁会赢得游戏?
有多组样例,第一行输入一个样例数T(0 每个样例只有一行,三个正整数n,l,r (0
每个样例只有一行,如果小师妹赢了输出“Win”,输了就输出“Lose”。
/*
类型:博弈
分析:这种类型题的基本思路是找到一种恒定不变的方式,使得对方无论怎么拿,你都能找到对应要拿的数量
举个例子,假如n=22,取的区间为[1,2],那么小师妹第一次拿走1个,
使得剩下的数量21,是区间左右端点之和的倍数,即3的倍数.
那么无论对方怎么拿,我们都能维持剩下来的数量是3的倍数的状态不变,比如他拿1个,你就拿2个,或者他拿2个,你就拿1个
始终保持他能拿,我必能拿的状态,那么只要判断初始情况,我就知道我能不能稳赢
回顾刚刚的拿法,我们很容易推出一个方式判断第一个人应该如何拿,即余数=n%(L+R)
1.假设这个余数落在[L,R]里面,那么小师妹第一次把余数全抓走,剩下的是(L+R)的倍数,我们知道,小师妹稳赢
2.假设这个余数为L-k (0
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 505;
int main()
{
int t;cin>>t;
while(t--){
int n,l,r;
scanf("%d%d%d",&n,&l,&r);
if(n%(l+r)
矩形A能与矩形B不接触的放在矩形B里就称为矩形A能嵌套进矩形B。
给你n个矩形,编写程序,判断它们能否互不接触嵌套n层。
如:有2 * 2 , 4*5,3*4 三个矩形。
方案一嵌套非法,但是方案二合法(嵌套顺序任意),所以2*2,3*4,4*5满足条件
第一行一个整数t(t < 15 ),表示有t组数据。 每组数据第一行一个整数n(n < 10000),矩形的个数,接下去的n行,每行两个正整数x和y(由空格分开),第i行表示第i个矩形的长为x和宽为y。(0 < y <= x < 100000 )
每组数据输出一行,矩形能完成嵌套则输出“Yes”,否则输出“No”。(不包含双引号)
/*
分析:因为题目限制了n个矩形要达到n层嵌套,所以对于n个矩形能否满足条件,
我们只需要先对所有矩形的面积从小到大排序,再判断相邻两个矩形能否嵌入即可
*/
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 10000+5;
struct rt{
ll x,y,s;
};
rt a[maxn];
bool cmp(const rt&a,const rt&b){
return a.s>t;
while(t--){
int n;scanf("%d",&n);
for(int i=0;ia[i-1].x&&a[i].y>a[i-1].y)||(a[i].x>a[i-1].y&&a[i].y>a[i-1].x))continue;
else{
flag=0;break;
}
}
if(flag)puts("Yes");
else puts("No");
}
return 0;
}
/**************************************************************
Problem: 1200
User: MDZZhhh
Language: C++
Result: Accepted
Time:8 ms
Memory:1940 kb
****************************************************************/
/*
分析:判断一个数的二进制里面有几个1,不断对2取模和除2,看有几个满足即可
*/
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 10000+5;
int main()
{
//int t;cin>>t;
ll n;
while(~scanf("%lld",&n)&&n!=-1){
int sum=0;
while(n){
sum+=n%2;
n/=2;
}
printf("%d\n",sum);
}
return 0;
}
/**************************************************************
Problem: 1201
User: MDZZhhh
Language: C++
Result: Accepted
Time:8 ms
Memory:1696 kb
****************************************************************/
男神pigofzhou在开学还没多久就基本上与16级几乎所有的师妹打成了一片,不过由于男生pigofzhou认识的师妹太多了,但是又怕忘了,于是就拿个本子记录下来,有一天他忽然想看一下这本本子有多少面,但是毕竟是pigofzhou怎么可能直接去数本子有多少面呢,于是对于每一页的页码都用键盘敲到电脑上,然后数自己敲了几次键盘,从而计算出本子有多少面,可以吧,这很pigofzhou,例如页码为1~9页,每页敲一下键盘,页码为10~99页,每页敲2下键盘,页码为100~999页,每页敲三下,以此类推。
输入一个正整数t(0
输出一个正整数表示这本本子有多少面
虽然广工没那么多女生,但是数据并不小
/*
分析:先预处理出第9、99、999、9999...页敲击键盘的次数,得到边界值,
然后每次用边界值查找到n属于那个区域,再用n减去下界的次数得到从该区域第一个页数到当前页数的总敲击次数
再用敲击次数求出该页数是在当前区域的第几个,再-1+10^数字的位数,就是答案
*/
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 10000+5;
ll a[15],p[15];//a储存边界值,p[i]表示10^(i-1)
int main()
{
a[1]=9;p[1]=1;
for(ll i=2,t=10;i<=13;i++,t*=10){
a[i]=i*9*t+a[i-1];
p[i]=t;
}
int t;cin>>t;
while(t--){
ll n;scanf("%lld",&n);
for(int i=1;i<=13;i++){
if(a[i]>n){
printf("%lld\n",(n-a[i-1])/i-1+p[i]);
break;
}
}
}
return 0;
}
/**************************************************************
Problem: 1202
User: MDZZhhh
Language: C++
Result: Accepted
Time:0 ms
Memory:1696 kb
****************************************************************/
/*
类型:贪心+模拟
分析:先记录26个字母的出现次数num[],若num[i]为奇数,且只有一个字母,那么可以直接输出
若存在多个num[i]为奇数
这时分两种情况:
1.需要把其它字母改为当前字母;
2.把该字母改为其它字母。
为了得到最小字典序,我们贪心的选择将字典序大的字母改为字典序小的字母,按照这样的思维模拟下去。
*/
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 200000+5;
char s[maxn];
int a[30],n;
void print(){
int flag=-1;
for(int i=0;i<26;i++){
if(a[i]%2)flag=i;
}
if(flag==-1){
for(int i=0;i<26;i++){
int len=a[i]/2;
for(int j=0;j=0;i--){
for(int j=0;j=0;i--){
for(int j=0;j>t;
while(t--)
{
memset(a,0,sizeof(a));
scanf("%s",s);
int len=strlen(s);
n=len;
for(int i=0;i=0;i--){
if(a[i]%2){
if(r==-1){
r=i;
break;
}
}
}
for(int i=0;i<25;i++){
if(a[i]%2&&l==-1){
l=i;
break;
}
}
if(l!=r){
a[r]--;
a[l]++;
}
}
print();
}
}
return 0;
}
/**************************************************************
Problem: 1203
User: MDZZhhh
Language: C++
Result: Accepted
Time:0 ms
Memory:1896 kb
****************************************************************/
/*
分析:直接写把
*/
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 200000+5;
int main()
{
//int t;cin>>t;
int n;
while(~scanf("%d",&n)){
if(n<0)puts("impossble");
else printf("%d\n",2*n+1);
}
return 0;
}
/**************************************************************
Problem: 1204
User: MDZZhhh
Language: C++
Result: Accepted
Time:0 ms
Memory:1696 kb
****************************************************************/
/*
分析:价格从小到大买就行了
*/
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 1e6+5;
struct babi{
ll num,val;
};
babi a[maxn];
bool cmp(const babi&a,const babi&b){
return a.val