学长给的翻译就是好哇!!!通俗易懂!!!嘻嘻嘻懒得自己翻了。
A .Floor Number
题目大意:今天是yyj要去约会的日子,为了显示出他的帅气,他决定穿着编号为n的衣服出门,可是他忘了自己的衣服放在哪里了,yyj家是一栋可以无限增长的高楼,每层都有他的衣柜,除了第一层有两个衣柜,其他每层均有x个衣柜,且衣柜的编号依次递增,yyj的每一件衣服都是独特的,所以他的每一个衣柜中只会放一件衣服,请你帮助yyj找到他的衣服在哪一层
输入的第一行包含一个整数t(1≤t≤1000)——测试用例的数量。
然后是t行测试用例。 每行包含两个整数n和x(1≤n,x≤1000)--yyj要去取的n号衣服和除第一层以外的每层的衣柜数(一层只有两个衣柜)。
输出yyj要前往的层数
input
4
7 3
1 5
22 5
987 13
output
3
1
5
77
note:在第一个测试样例中,yyj要取3号衣服,一层有两个衣柜,编号为1、2,其余层都有9个衣柜,所以二层衣柜编号为3到11,所以yyj要去第二层拿衣服。
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int n,x;
cin>>n>>x;
if(n<=2) cout<<"1"<<endl;
else
{
int sum=(n-2)/x;
if((n-2)%x!=0) sum++;
cout<<sum+1<<endl;
}
}
return 0;
}
题目大意:PP有n种中不同样式的方块,但是每种方块的数量都有无限的。方块长为2,宽也是2,因此一个方块中可以包含有4个数字(四个数字分别位于方块的左上方,右上方,左下方,右下方)。
PP现在想用这些方块拼成一个长为m,宽为m的大方块(即大方块中包含m*m个数字,我们可以将这样的大方块看作一个大矩阵)。PP热爱一切拥有对称美的事物,他想让拼成的大方块所构成的矩阵是对称矩阵。请你帮他确认他是否可以做到呢?
(注:对称矩阵是矩阵所有元素以主对角线为对称轴对应相等)
测试用例的第一行包含两个整数n和m(1≤n≤100,1≤m≤100)——方块类型的数量n和PP想要拼的大方块的大小m。
接下来的2n行描述n种不同的方块。方块的类型一个接一个地写,每一个类型都写在两行上。
请注意禁止对所给的方块进行旋转,只允许将其放置在输入中的方向。
对于每个测试:如果PP可以构造大小为m×m的方块,且是一个对称矩阵,则输出“YES”。否则,输出“NO”。
Input
6 3 4 1 2 5 6 5 7 7 4 8 9 9 8 2 5 1 1 1 1 2 2 2 2 1 100 10 10 10 10 1 2 4 5 8 4 2 2 1 1 1 1 1 2 3 4 1 2 1 1 1 1Output
YES NO YES NO YES YES
(input这一串太长了!周测的时候眼睛长歪了看走眼了,给数据画线的时候画歪了。。。白wa了两次)
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int n,m;
cin>>n>>m;
int a,b,c,d,flag=0;
for(int i=1;i<=n;i++)
{
cin>>a>>b;
cin>>c>>d;
if(b==c) flag=2;
}
if(m%2==1) cout<<"NO"<<endl;
else if(flag==2) cout<<"YES"<<endl;
else cout<<"NO"<<endl;
}
return 0;
}
题目大意:刚开始给你一个数组为[1],。你每次可以有如下两种操作:
(1) 从数组中选择任意一个数字,并分裂成两个一模一样的数。
(2) 从数组中选择一个数加1。
例如,现在你有五次操作的机会。
第一次,把第一个数分裂,变成[1,1]。
第二次,把第一数加1操作,[2,1]。
第三次,把第二个数分裂,[2,1,1]。
第四次,把第一个数分裂,[2,1,1,2]。
第五次,把第四个数加1,[2,1,1,3]。
五次后数组元素总和为2+1+1+3 = 7.
你的任务是消耗最少的次数使得数组的总和大于等于n。
输入的第一行包含一个整数t(1≤t≤1000)--测试用例的数量。然后,t个测试用例随之而来。
测试用例的唯一一行包含一个整数n(1≤n≤1000000000)--总和。对于每个测试用例,打印答案:获得数组总和至少为n的最少操作次数。
Input
4 1 5 42 1000000000Output
0 3 11 63244
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int a;
cin>>a;
if(a==1) cout<<"0"<<endl;
else if(a==2) cout<<"1"<<endl;
else if(a==3||a==4) cout<<"2"<<endl;
else if(a==5||a==6) cout<<"3"<<endl;
else if(a==7||a==8||a==9) cout<<"4"<<endl;
else
{
/*if(a%2==1) a++;
int sum=a;
for(int i=2;i<=(int)sqrt(a);i++)
{
if(a%i==0)
{
int j=a/i;
sum=min(sum,j+(i-2));
}
}
cout<<sum<<endl;*/
int b=sqrt(a);
int c=a/b; //cout<<b<<" "<<c<<endl;
int sum=(b-1)+(c-1);
if(a!=b*c) sum++;
cout<<sum<<endl;
}
}
return 0;
}
代码繁琐了些,因为第一思路歪了点(捂脸),第二思路掰回来了就欧克了。
鲜花学长喜欢1,因为他平时收到消息时会回复别人1,所以他非常不喜欢0,他的目标是消灭数组中所有的0, 有一个数组a,其中不存在a_i=0,但是丧心病狂的它觉得这还不能够满足 即使是这个数组的任意子段(subsegment)的和为0也是它不能接受的。 他可以往数组中的任意位置插入任意大小的数(注意是任意大小,包括无穷大),请问最少插入几个数后才能成为鲜花学长的理想数组(即不存在子段和为0的情况)
第一行为数组元素个数n∈[2,200 000] 第二行为n个元素a_i∈[-10^9,10^9],a_i≠0
输出需要最少插入数字的个数
Input
4 1 -5 3 2Output
1Input
5 4 -2 3 -9 2Output
0Input
9 -1 1 -1 1 -1 1 1 -1 -1Output
6Input
8 16 -5 -11 -15 10 5 4 -4Output
3
思路:用map存储出现的sum次数,遇到重复的时候即前缀中有为0的时候,time++,重新初始化,以此类推。
#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int n;
cin>>n;
int a[200200],time=0;
long long int sum=0;
map<long long int,int> mp;
mp[0]=1;
for(int i=1;i<=n;i++)
{
cin>>a[i];
sum+=a[i];
if(mp[sum]!=0)
{
time++;
mp.clear();//清空后再加入初始化和第一步
mp[0]=1;
sum=a[i];
}
mp[sum]++;
}
cout<<time<<endl;
return 0;
}
题意:
alice和bob玩剪刀石头布, 他们玩的次数n次,已知alice出了a1个石头、a2个剪刀、a3个布,bob出了b1个石头、b2个剪刀、b3个布,现在你可以调整他们的出拳顺序,问alice最少赢了多少次,最多赢了多少次。 其中 a1+a2+a3=b1+b2+b3=n ( 1<=n<=10^9)
Input
2 0 1 1 1 1 0Output
0 1Input
15 5 5 5 5 5 5Output
0 15Input
3 0 0 3 3 0 0Output
3 3Input
686 479 178 29 11 145 530Output
22 334Input
319 10 53 256 182 103 34Output
119 226
(问Alice最少赢了几次,最多赢了几次?)
max=min(a1,b2)+min(a2,b3)+min(a3,b1);
min的思考方式:
alice的石头跟bob的石头+布抵消; 剪刀跟石头+剪刀抵消; 布跟剪刀+布抵消。
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int main()
{
cin.tie(0);
cout.tie(0);
ios::sync_with_stdio(false);
int n;
cin>>n;
int a1,a2,a3,b1,b2,b3;
cin>>a1>>a2>>a3;
cin>>b1>>b2>>b3;
int minn=0,maxn=0;
if(a1-b1-b3>=0) minn+=a1-b1-b3;
if(a2-b1-b2>=0) minn+=a2-b1-b2;
if(a3-b2-b3>=0) minn+=a3-b2-b3;
maxn=min(a1,b2)+min(a2,b3)+min(a3,b1);
cout<<minn<<" "<<maxn<<endl;
return 0;
}
据苏佬说f跟省赛a题很像。。。算了先吃饭,dp令人害怕。。。