目录
rzt A6. Help Vasilisa the Wise 2
A10. Polo the Penguin and Segments
★A12. Yaroslav and Permutations
★A15. BowWow and the Timetable
★A21. Case of the Zeros and Ones
★A25. Left-handers, Right-handers and Ambidexters
rzt A26. George and Accommodation
rzt A29. The New Year: Meeting Friends
rzt A32. Ultra-Fast Mathematician
★A33. Little Pony and Crystal Mine
A34. One-dimensional Japanese Crossword
★A43. Far Relative’s Birthday Cake
rzt A46. Roma and Lucky Numbers
A1. Counterexample
题意:
求在 l 到 r 之间满足a,b的最大公约数等于 b ,c 的最大公约数等于 1 ,且 a,c的最大公约数不等于 1 的数 a,b ,c
三个for循环暴力查找+开long long
十年OI一场空,不开long long见祖宗
#include <iostream>
#define ll long long
using namespace std;
ll gcd(ll a,ll b)
{
return b? gcd(b,a%b):a;
}
int main()
{
ll l,r;
cin>>l>>r;
for(ll i=l;i<=r;i++)
for(ll j=i;j<=r;j++)
for(ll k=j;k<=r;k++)
if(gcd(i,j)==1&&gcd(j,k)==1&&gcd(i,k)!=1)
{
cout<<i<<' '<<j<<' '<<k;
return 0;
}
cout<<-1;
}
A2. Good Number
题意:
第一行输入n和k n—n行数据
接下来n行输入n个数
如果该数的各个位数包含0~k的每个数 则该数为k-好数
求k-好数的个数
用标记法
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n,k,x,sum=0,i;
int index[9]={0};
cin>>n>>k;
while(n--)
{
cin>>x;
for(i=0;i<=k;i++) index[i]=0;
while(x)
{
index[x%10]=1;
x/=10;
}
for(i=0;i<=k;i++)
if(index[i]==0) break;
if(i==k+1) sum++;
}
cout<<sum;
}
A3. Dice Tower
题意:
第一行输入骰子数n
第二行输入第一个骰子的顶面
接下来n行输入骰子的正面 和侧面
注意叠起来的骰子塔相连的部分应该是一样的
判断给定数据是否能叠成一个合格的骰子塔
我们只需要一个一个骰子分析
给的正面和侧面是否合格 不合格输出NO 反之YES
然后每次循环更新一下顶面数据即可
#include <iostream>
using namespace std;
int main()
{
int n,top,a,b;
cin>>n;
cin>>top;
while(n--)
{
cin>>a>>b;
if(a==b||a+b==7||a==top||b==top||a==7-top||b==7-top)
{
cout<<"NO";
return 0;
}
top=7-top;
}
cout<<"YES";
return 0;
}
★A4. Alyona and Numbers
题意:
给定两个数n, m(1 <= n,m <= 1000000)。分别从1~n, 1~m中选择两个数,使它们的和为5的倍数,求这样的数对共有多少(a+b, b+a视为不同的数对)。
暴力双for肯定不行的 会TLE(要不然也太简单了)
这题是数论题……啊烦人的数学
思路:
想要两个数相加为 5 的倍数,那它们除5的余数相加必须等于 5
或者两者除5的余数都为0
本题要计算满足两数之和是5倍数的数对个数
那么就是先各找出n m范围内余数为0 1 2 3 4的个数 存数组里
然后根据排列组合的原理算出结果即可(因为题目说a+b和b+a算不同的数对)
#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long a[5],b[5];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) a[i%5]++;
for(int i=1;i<=m;i++) b[i%5]++;
cout<<a[0]*b[0]+a[1]*b[4]+a[2]*b[3]+a[3]*b[2]+a[4]*b[1]; //排列组合算出结果
return 0;
}
A5. Mountain Scenery
题意:
第一行给出n k
第二行给出序列
比如: 3 2
0 5 3 5 1 5 2
其中偶数位 - 1仍然满足大于前后两个数 题目要求其中有2个下标为偶数的数相比输入的序列被减了1 也就是可以是0 4 3 4 1 5 2
这题有sqj 所以跟样例不同很正常
#include <iostream>
using namespace std;
int main()
{
int n,k,a[201],i;
cin>>n>>k;
for(i=1;i<=2*n+1;i++) cin>>a[i];
for(i=2;i<=2*n+1;i+=2)
{
if(a[i]-1>a[i-1]&&a[i]-1>a[i+1]) k--,a[i]--;
if(k==0) break;
}
for(i=1;i<=2*n+1;i++) cout<<a[i]<<' ';
}
rzt A6. Help Vasilisa the Wise 2
题意:
有一个 2×2 的棋盘,有 9 个棋子,上面分别写着 1,2,3,…9。现在给出每行每列及每条对角线上两个棋子 的数之和,求相应的棋子摆放方法。无解输出 -1
暴力枚举即可 O(9^4)
#include <iostream>
using namespace std;
int main()
{
int r1,r2,c1,c2,d1,d2;
cin>>r1>>r2>>c1>>c2>>d1>>d2;
for(int i1=1;i1<=9;i1++)
for(int i2=1;i2<=9;i2++)
for(int i3=1;i3<=9;i3++)
for(int i4=1;i4<=9;i4++)
if(i1+i2==r1&&i3+i4==r2&&i1+i3==c1&&i2+i4==c2&&i1+i4==d1&&i2+i3==d2&&(i1!=i2)&&(i1!=i3)&&(i1!=i4)&&(i2!=i3)&&(i2!=i4)&&(i3!=i4))
{
cout<<i1<<' '<<i2<<endl<<i3<<' '<<i4;
return 0;
}
cout<<-1;
}
A7. Chewbaсca and Number
题意:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
string a;
cin>>a;
for(int i=0;i<a.size();i++)
a[i]=min(a[i],char(9+'0'-a[i]+'0'));
if(a[0]=='0') a[0]='9';
cout<<a;
}
★A8. Ksenia and Pan Scales
题意:
令人头大的一道题 烦死了呜呜
思路:
先计算天平两侧的初始个数 l 和 r
根据下图思路划定中位线(找规律)
然后进行分配 如果左右个数不等 则输出impossible
否则输出结果就行
#include <iostream>
using namespace std;
int main()
{
string l,r,a,b;
int flag=0,len=0,ren=0;
cin>>a>>b;
int lenb=b.size();
for(int i=0;i<a.size();i++)
{
if(a[i]!='|'&&!flag) l+=a[i],len++;
if(flag) r+=a[i],ren++;
if(a[i]=='|') flag=1;
}
int mid=(lenb-(len-ren))/2; //mid为记录字符串b的中线
for(int i=0;i<mid;i++) l+=b[i],len++;
for(int i=mid;i<lenb;i++) r+=b[i],ren++;
if(len!=ren)
{
cout<<"Impossible";
return 0;
}
cout<<l<<'|'<<r;
}
★A9. Launch of Collider
题意:
找规律即可发现只有 RL这种情况才能碰撞(一个向右 一个向左)
所以只要找到RL这种组合 然后循环比较出最小时间即可
时间=后面-前面 / (v1+v2)
注意0x3f3f3f3f是最大数
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n,res=0x3f3f3f3f;
string d;
cin>>n>>d;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=1;i<n;i++)
if(d[i-1]=='R'&&d[i]=='L')
res=min(res,(a[i]-a[i-1])/2);
if(res==0x3f3f3f3f) cout<<-1;
else cout<<res;
}
A10. Polo the Penguin and Segments
题意:
这题根本不用管区间的l和r数是什么 只要管该区间所包含的整数数量
用sum把整数数量和求出 因为只能将区间扩展 意思是只能sum++
也就是求sum%k==0 时 sum++的次数
#include <iostream>
using namespace std;
int main()
{
int n,k,l,r,sum=0,cnt=0;
cin>>n>>k;
while(n--)
{
cin>>l>>r;
sum+=r-l+1;
}
while(sum%k!=0)
{
sum++;
cnt++;
}
cout<<cnt;
}
★A11. IQ Test
题意:
这题究极找规律 看了下面这篇题解 看完我顿悟了(没有)
但其实理解错了 我第一次以为是统计4×4的表格 但其实是统计2×2的表格
大佬的思路太强了 这方法的代码又简短又易懂 找规律yyds
#include <iostream>
using namespace std;
int q(char ch)
{
return ch=='.'? -1:1;
}
int main()
{
char a[4][4];
int i,j,flag=0;
for(i=0;i<4;i++)
for(j=0;j<4;j++)
cin>>a[i][j];
for(i=0;i<3;i++)
for(j=0;j<3;j++) //或运算 如果出现1 flag就为1
flag|=q(a[i][j])+q(a[i+1][j])+q(a[i][j+1])+q(a[i+1][j+1]);
if(!flag) cout<<"NO";//如果循环完flag都是0 则说明没有符合题意的2×2方格
else cout<<"YES";
}
★A12. Yaroslav and Permutations
题意:
有一个数组,现在你要在有限的次数内移动相邻的两个数,最后是否能使数组中没有数字相同的相邻元素。
思路:
想要元素不相邻,即同一个元素要间隔放,已知相同一个元素最多可以这样
k a k b k c k n=7 k出现4次
即最多可以出现(n+1)/ 2次,只要k出现的次数小于该最大次数,就能实现间隔排放
其中k为该数组中出现次数最大的数
#include <iostream>
using namespace std;
int main()
{
int n,x,maxn=0,index[1001]={0};
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x;
index[x]++;
if(maxn<index[x]) maxn=index[x];
}
if(maxn<=(n+1)/2) cout<<"YES";
else cout<<"NO";
}
★A13. Snow Footprints
题意:
这题1300 而且是spj题 有1000种解法
思路:
三种情况:只有L 只有R 和RRLL这种 至于LLRR这种模拟一下就知道不可能
#include <iostream>
using namespace std;
int main()
{
int n;
string s;
cin>>n>>s;
int lst=-1,led=-1,rst=-1,red=-1;
for(int i=0;i<n;i++)
{
if(s[i]=='R') red=i;
if(s[i]=='L') led=i;
if(rst==-1&&s[i]=='R') rst=i;
if(lst==-1&&s[i]=='L') lst=i;
}
if(lst==-1) cout<<rst+1<<' '<<red+2;
else if(rst==-1) cout<<led+1<<' '<<lst;
else cout<<rst+1<<' '<<red+1; //+1是因为数组从0开始的 (字符串)
}
★A14. Raising Bacteria
题意:
每个细菌每天分裂成2个新细菌可以得到,要看到x个细菌就是求x里面有多少个2^n,2^n-1……2^0 由二进制的定义可得,这个题目就是求x在二进制下有多少个1
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int n,cnt=0;
cin>>n;
while(n)
{
if(n%2==1) cnt++;
n/=2;
}
cout<<cnt;
}
★A15. BowWow and the Timetable
题意:
我的思路是先把二进制转十进制 然后再在十进制数里找有多少个4的次方 cnt计数
但是卡第四个test 看了一下发现是精度问题(kao)
错误代码:
#include <iostream>
#include <cmath>
using namespace std;
signed main()
{
long long int n,sum=0,t=0,i=0,cnt=0;
cin>>n;
while(n)
{
sum+=n%10*pow(2,i++);
n/=10;
}
i=0;
while(t<sum)
{
t=pow(4,i++);
if(t>=sum) break;
cnt++;
}
cout<<cnt;
}
AC代码:
#include <iostream>
using namespace std;
int main()
{
int cnt=0;
string s,p="1";
cin>>s;
while(s.size()>=p.size())
{
if(s>p) cnt++;
p+="00";
}
cout<<cnt;
}
★A16. Balanced Rating Changes
题意:
由题可知
- ai为偶数 则bi=ai / 2
- ai为奇数 因为题目保证最后和为0 说明ai为奇数的个数肯定为偶数个(因为奇数+奇数=奇数)那么只要一半人向上取整 另外一半向下取整
#include <iostream>
using namespace std;
int main()
{
int n,x,flag=1;
cin>>n;
while(n--)
{
cin>>x;
if(x%2) cout<<(x+flag)/2<<endl,flag*=-1;
else cout<<x/2<<endl;
}
}
rzt A17. Word Capitalization
题意:
将首字母大写
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
if(s[0]>='a'&&s[0]<='z') s[0]-=32;
cout<<s;
}
rzt A18. Next Round
题意:
第一行分别输入 n k
n代表参赛人数 k代表排名前k位的都能晋级(和第k位并列的也可以)
问有多少人能晋级
其中0分的不算在晋级里边
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int n,k,cnt=0,s=0;
cin>>n>>k;
int a[n];
for(int i=1;i<=n;i++)
cin>>a[i];
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;i++)
if(a[i]>=a[k]&&a[i]!=0) cnt++;
cout<<cnt;
}
rzt A19. Young Physicist
题意:
坐标矢量和为0 输出YES 否则输出NO
#include<bits/stdc++.h>
using namespace std;
typedef struct
{
int x,y,z;
}sp;
int main()
{
int n,xz=0,yz=0,zz=0;
cin>>n;
sp p[101];
for(int i=0;i<n;i++)
{
cin>>p[i].x>>p[i].y>>p[i].z;
xz+=p[i].x;
yz+=p[i].y;
zz+=p[i].z;
}
if(xz==0&&yz==0&&zz==0) cout<<"YES";
else cout<<"NO";
}
rzt A20. Bit++
题意:
输入n
接下来n行输入字符串
x++和++x表示+1 x--和--x表示-1
输出结果 其中起始sum=0
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
int n,sum=0;
cin>>n;
while(n--)
{
cin>>s;
if(s[1]=='+') sum++;
else sum--;
}
cout<<sum;
}
★A21. Case of the Zeros and Ones
题意:
第一行输入n 表示字符串的长度
如果有1和0相连就删掉 问最后剩下几个字符
比如1100——10——空
再比如110010——1010——10——空
11110001——111001——1101——11——2个
因为10总是连在一块删掉的 所以只要配对的删掉 就是剩下的
所以要做的就是1和0配对 比如110010 ——3个1 3个0则都配对成功 所以剩下0个字符
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
int n,a=0,b=0;
cin>>n>>s;
for(int i=0;i<n;i++)
if(s[i]=='1') a++;
else b++;
cout<<fabs(a-b);
}
rzt A22. Translation
题意:
字符串翻转就是对的 输出YES
其他情况都是 NO 这题用reverse函数就是秒解
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s,t;
cin>>s>>t;
reverse(s.begin(),s.end());
if(s==t) cout<<"YES";
else cout<<"NO";
}
★A23. String Task
题意:
根据规则改字符串并输出
- 把大写都改成小写
- 遇到元音字母删除(a e i o u y)
- 遇到辅音字母前加.字符
我刚开始想的是字符数组 太麻烦了 要加要减的操作都很麻烦
这题教会我一个方法就是——一边改变一边输出
遇到元音字母就跳过不管 遇到辅音字母就cout<<'.'<<s[i]
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]>='A'&&s[i]<='Z') s[i]+=32;
if(s[i]!='a'&&s[i]!='e'&&s[i]!='i'&&s[i]!='o'&&s[i]!='u'&&s[i]!='y')
cout<<'.'<<s[i];
}
}
rzt A24. Laptops
题意:
第一行输入n 代表n台电脑
题目说只要出现一台电脑质量比价格高 就输出“Happy Alex”
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,x,y,flag=1;
cin>>n;
while(n--)
{
cin>>x>>y;
if(x<y) flag=0;
}
if(flag)cout<<"Poor Alex";
else cout<<"Happy Alex";
}
★A25. Left-handers, Right-handers and Ambidexters
题意:
l代表有l个人只能用左手 r代表有r个人只能用右手 a代表有a个人既能用左手也能用右手
输出一个整数,代表这个队伍里最多有多少人,如果组不成这样的队伍,则输出0
思路:
比如 6 2 7 先把右手不足的给他补上 变成6 6 3 然后再平均分配 7 7 1
此时这个1给谁都无所谓了因为结果就是 l 和 r 中最小的数×2
靠 刚开始写的呢代码简直就是if开会 下面这个代码跟第一次写的比起来简直通俗易懂
#include<bits/stdc++.h>
using namespace std;
int main()
{
int l,r,a;
cin>>l>>r>>a;
while(a)
{
if(l>=r) r++;
else l++;
a--;
}
cout<<min(l,r)*2;
}
rzt A26. George and Accommodation
题意:
太弱智了 我都不想写题意哈哈
n代表房间数 接下来n行输入p——已住人数 q——房间容量
问有几间房能再塞下两个人
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,p,q,cnt=0;
cin>>n;
while(n--)
{
cin>>p>>q;
if(q-p>=2) cnt++;
}
cout<<cnt;
}
A27. Vasya the Hipster
题意:
输入a代表红袜子个数 输入b代表蓝袜子个数
输出能有几天混穿 有几天能穿一双纯色
所以能混穿的天数就是a b小的值
剩下的除2就是穿纯色的天数
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,minx,maxn;
cin>>a>>b;
maxn=max(a,b);
minx=min(a,b);
cout<<minx<<' '<<(maxn-minx)/2;
}
A28. Fox And Snake
题意:
矩阵的控制 画蛇 调试就完事了
#include<bits/stdc++.h>
using namespace std;
int main()
{
int m,n,flag=-1;
cin>>m>>n;
for(int i=1;i<=m;i++)
{
if(i%2==0) flag=-flag;
for(int j=1;j<=n;j++)
{
if(i%2!=0) cout<<'#';
else if(flag==1&&j==n)cout<<'#';
else if(flag==-1&&j==1) cout<<'#';
else cout<<'.';
}
cout<<endl;
}
}
rzt A29. The New Year: Meeting Friends
题意:
给三个数 在中间那个数汇合 问最大到中间和最小到中间的距离之和 其实就是最大-最小
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[3];
for(int i=0;i<3;i++)
cin>>a[i];
sort(a,a+3);
cout<<a[2]-a[0];
}
A30. Elephant
题意:
输入一个n 有1 2 3 4 5可以凑这个数 问如何用最少的个数凑n
要想有最少的个数 那就用最大的5去凑 通过规律推出三种情况
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
if(n<=5) cout<<1;
else if(n%5!=0) cout<<n/5+1;
else cout<<n/5;
}
A31. Greg's Workout
题意:
思路没啥问题 一直卡的点是因为数组开小了 我下标从1开始的 所以应该开a[n+1]
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,cnt=0,s1=0,s2=0,s3=0;
cin>>n;
int a[n+1];
for(int i=1;i<=n;i++)
{
cin>>a[i];
cnt++;
if(cnt==1) s1+=a[i];
else if(cnt==2) s2+=a[i];
else {
s3+=a[i];
cnt=0;
}
}
int maxn=max(max(s1,s2),s3);
if(maxn==s1) cout<<"chest";
else if(maxn==s2) cout<<"biceps";
else cout<<"back";
}
rzt A32. Ultra-Fast Mathematician
题意:
给你两长度相同的字符串 要求做异或运算 其中1+1=0 1+0=1 0+0=0
#include<bits/stdc++.h>
using namespace std;
int main()
{
string s1,s2;
cin>>s1>>s2;
for(int i=0;i<s1.size();i++)
{
if(s1[i]-'0'+s2[i]-'0'==1) cout<<1;
else if(s1[i]-'0'+s2[i]-'0'==0) cout<<0;
else cout<<0;
}
}
★A33. Little Pony and Crystal Mine
题意:
打印题 让我想起天梯赛的打印沙漏 真是可怕
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,t=1,i,j;
cin>>n;
for(i=1;i<=n/2+1;i++)
{
for(j=1;j<=(n-t)/2;j++) cout<<'*';
for(j=1;j<=t;j++) cout<<'D';
for(j=1;j<=(n-t)/2;j++) cout<<'*';
t+=2;
cout<<endl;
}
t-=4;
for(i=1;i<=n/2;i++)
{
for(j=1;j<=(n-t)/2;j++) cout<<'*';
for(j=1;j<=t;j++) cout<<'D';
for(j=1;j<=(n-t)/2;j++) cout<<'*';
t-=2;
cout<<endl;
}
}
A34. One-dimensional Japanese Crossword
题意:
例如BWBBBWWBW 有三组B 这三组B的个数分别是1 3 1
所以输出就是
3
1 3 1
思路就是找子串 其他的也没啥难度
#include<bits/stdc++.h>
#define int long long
using namespace std;
signed main()
{
int n,cnt=0,sum=0,k=0;
string s;
cin>>n;
cin>>s;
int a[n];
for(int i=0;i<n;i++)
if(s[i]=='B')
{
sum++;
if(s[i+1]=='W'||s[i+1]=='\0') cnt++,a[k++]=sum,sum=0;
}
cout<<cnt<<endl;
for(int i=0;i<cnt;i++)
cout<<a[i]<<' ';
}
rzt A35. Soldier and Bananas
题意:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int k,n,w,sum=0;
cin>>k>>n>>w;
for(int i=1;i<=w;i++)
sum+=k*i;
if(sum>n) cout<<sum-n;
else cout<<0;
}
A36. Bus to Udayland
https://codeforces.com/contest/711/problem/A
题意:
有n排座位,每排座位包含左右两部分,被
|
分隔,其中O代表没人坐,X
代表有人坐。 问你是否存在连续的两个座位没人坐,存在输出YES
,并把这两个座位改为++
。 输出修改以后的情况,不存在输出NO
。
#include <iostream>
using namespace std;
int main()
{
int n,i,j,flag=0;
char s[1010][8];
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<5;j++)
{
cin>>s[i][j];
if(s[i][0]=='O'&&s[i][1]=='O'&&flag!=1)
{
flag=1;
s[i][0]='+',s[i][1]='+';
}else if(s[i][3]=='O'&&s[i][4]=='O'&&flag!=1)
{
flag=1;
s[i][3]='+',s[i][4]='+';
}
}
if(!flag) cout<<"NO";
else
{
cout<<"YES"<<endl;
for(i=0;i<n;i++)
{
for(j=0;j<5;j++)
cout<<s[i][j];
cout<<endl;
}
}
}
A37. Cookies
https://codeforces.com/contest/129/problem/A
题意:
有n袋饼干(1≤n≤100),每袋里有1≤ai≤100块饼干。拿走一袋饼干,使剩下的饼干数为偶数。求有多少种拿走的方案。
思路:
只要存在奇数个奇数 则需要拿走奇数的饼干
偶数个奇数和为偶数 那么拿走偶数的饼干即可
#include <iostream>
using namespace std;
int main()
{
int n,x,even=0,odd=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>x;
if(x%2==0) even++;
else odd++;
}
if(odd%2==0) cout<<even;
else cout<<odd;
}
A38. Second Order Statistics
https://codeforces.com/contest/22/problem/A
题意:
给定一个数组,输出其中第二小的整数(相等的整数只计算一次)
用set很好做 只要把第一个删掉 再用s.begin()就行
#include <iostream>
#include <set>
using namespace std;
int main()
{
set<int>s;
int n,x;
cin>>n;
int t=n;
while(n--)
{
cin>>x;
s.insert(x);
}
if(t<2||s.size()==1)
{
cout<<"NO";
return 0;
}
s.erase(s.begin());
cout<<*s.begin();
}
rzt A39. Nearly Lucky Number
https://codeforces.com/contest/110/problem/A
题意:
如果一个数仅包含4和7,那么它就是一个"幸运数字"。 如果一个数本身不是幸运数,但是它所含有的数字4和7的个数之和为一个"幸运数字",那么它就是一个"类幸运数字"。 给您一个数,请编程判断它是不是"类幸运数字"。
#include <iostream>
using namespace std;
int main()
{
string s;
int cnt=0;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='4'||s[i]=='7') cnt++;
}
if(cnt!=0&&(cnt==4||cnt==7)) cout<<"YES";
else cout<<"NO";
}
rzt A40. Playing with Dice
https://codeforces.com/contest/378/problem/A
题意:
两个人正在玩游戏。每人写一个 1~6 之间的数,然后掷骰子。写下的数字和骰子上的数最接近的那个人获胜。如果两个人写的数和骰子上的数差距都是一样的,那么是平局。
第一个人写的数是 a,第二个人写的数是 b。 请分别输出第一个人赢、平局、第二个人赢有多少种可能(方法数)。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int a,b,aw=0,bw=0,dr=0;
cin>>a>>b;
for(int i=1;i<=6;i++)
{
if(abs(a-i)<abs(b-i)) aw++;
else if(abs(a-i)==abs(b-i)) dr++;
else bw++;
}
cout<<aw<<' '<<dr<<' '<<bw;
}
rzt A41. A Good Contest
https://codeforces.com/contest/681/problem/A
题意:
如果出现比赛之前即为红色等级(分>=2400)且分数有长进的 输出YES
#include <iostream>
using namespace std;
typedef struct
{
string s;
int a;
int b;
}stu;
int main()
{
stu p[101];
int n,flag=0;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>p[i].s>>p[i].a>>p[i].b;
if(p[i].a>=2400&&p[i].b-p[i].a>0)
flag=1;
}
if(flag) cout<<"YES";
else cout<<"NO";
}
A42. Beautiful Year
https://codeforces.com/contest/271/problem/A
题意:
给定一个年份n,输出大于n的第一个四位数字都不相同的年份。
这题是天梯赛L1 出生年的降级版哈哈
#include <iostream>
using namespace std;
int main()
{
int y,a[4];
cin>>y;
while(1)
{
y++;
a[0]=y/1000;
a[1]=y/100%10;
a[2]=y/10%10;
a[3]=y%10;
if(a[0]!=a[1]&&a[0]!=a[2]&&a[0]!=a[3]&&a[1]!=a[2]&&a[1]!=a[3]&&a[2]!=a[3])
break;
}
cout<<y;
}
★A43. Far Relative’s Birthday Cake
https://codeforces.com/contest/629/problem/A
题意:
输入格式:
第一行输入一个整数n(1<=n<=100),表示蛋糕边的长度。然后输入n行数,每行有n个字符。空的细胞用'.'表示,而含有巧克力的细胞用“C”表示。
输出格式:
输出“家庭之门”幸福感的价值,即同一行或同一列的一对巧克力片的数量
思路:
注意:像C C C这种序列 一对巧克力的数量应该是3对 (1,2)(1,3)(2,3)
所以也就是高斯求和公式n*(n-1)/2
其实找规律也可以得出:3个C=2+1 4个C=3+2+1 5个C=4+3+2+1
则用一个双for 同时记录每一行每一列C的个数 然后用高斯求和公式计算求和即可
#include <iostream>
using namespace std;
int main()
{
int n,i,j,h,l,sum=0;
char s[101][101];
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>s[i][j];
for(i=0;i<n;i++)
{
h=0,l=0;
for(j=0;j<n;j++)
{
if(s[i][j]=='C') l++; //代表每列的C的个数
if(s[j][i]=='C') h++; //代表每行的C的个数
}
sum+=(l-1)*l/2+(h-1)*h/2;
}
cout<<sum;
}
★A44. Mashmokh and Lights
https://codeforces.com/contest/415/problem/A
题意:
有编号为1 - n共n个灯。按下i号开关后,所有编号≥i的灯都会被关掉。给出n, m两个数,分别表示灯的数量和按下的开关数,输出每个灯被第一次关掉时开关的编号。
#include <iostream>
using namespace std;
int main()
{
int n,m,x;
cin>>n>>m;
int a[101]={0};
while(m--)
{
cin>>x;
for(int i=x;i<=n;i++)
if(a[i]==0) a[i]=x;
}
for(int i=1;i<=n;i++)
cout<<a[i]<<' ';
}
rzt A45. Triangular numbers
#include <iostream>
using namespace std;
int main()
{
int n,i;
cin>>n;
for(i=1;i<32;i++)
if(i*(i+1)/2==n)
{
cout<<"YES";
return 0;
}
cout<<"NO";
}
rzt A46. Roma and Lucky Numbers
https://codeforces.com/contest/262/problem/A?f0a28=1
题意:
刚开始没看清题 意思是4和7是幸运数字
n指给出n个数 问有几个数满足幸运数字出现次数<=k
输出满足条件的个数
#include <iostream>
using namespace std;
int main()
{
int n,k,sum=0;
string s;
cin>>n>>k;
while(n--)
{
int cnt=0;
cin>>s;
for(int i=0;i<s.size();i++)
if(s[i]=='4'||s[i]=='7') cnt++;
if(cnt<=k) sum++;
}
cout<<sum;
}
★A47. Toy Army
https://codeforces.com/contest/84/problem/A
题意:
这题说实话 没看懂题是啥意思……待补
#include<iostream>
using namespace std;
long long n;
int main()
{
cin>>n;
cout<<n/2*3;
}
A48. Levko and Table
https://codeforces.com/contest/361/problem/A
题意:
Levko 很喜欢幻方,他想构造一个长宽都是 n 且每行每列的和都是 k 的幻方
spj题 要满足每行每列和都为k 最简单的方法就是对角线是k
#include <iostream>
using namespace std;
int main()
{
int n,k,a[101][101];
cin>>n>>k;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
{
if(i==j) a[i][j]=k;
else a[i][j]=0;
cout<<a[i][j]<<' ';
}
cout<<endl;
}
}
★A49. Cards
https://codeforces.com/contest/701/problem/A
题意:
现在有n张卡牌(n为偶数),每张卡牌上都写着一个正整数。有n/2个人要玩这个卡牌游戏,在游戏开始时每个人会得到两张卡牌,每张卡牌只能给一个玩家。 现在让你发卡牌,使每一个人手上的卡片上所写的数字的总和相等。数据保证有发牌的方案符合题目要求。
思路:
因为题目保证肯定能凑 所以直接sort排序
然后两头取就ok了 注意用结构体记录原序列的下标
毕竟答案要求输出的是原序列的下标
#include <iostream>
#include <algorithm>
using namespace std;
typedef struct
{
int idx,val;
}st;
bool cmp(st a,st b)
{
return a.val<b.val;
}
int main()
{
st a[101];
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i].val;
a[i].idx=i;
}
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n/2;i++)
cout<<a[i].idx<<' '<<a[n+1-i].idx<<endl;
}
A50. Wizards' Duel
https://codeforces.com/contest/591/problem/A
题意:
第一行输入一个整数 l (1<=l<=1000 )-----走廊长度
第二行输入正整数 p ,第三行输入正整数 q -----分别代表哈利波特与伏地魔施展的魔法的飞行速度。
输出一个正数-----从哈利波特的位置到两个咒语第二次碰撞位置的距离。
思路:
画个图发现其实第二次碰撞就是第一次碰撞的位置
所以用时间t=l/(a+b) 乘以哈利的魔法速度a即可
#include <iostream>
#include <stdio.h>
using namespace std;
int main()
{
double l,a,b;
cin>>l;
cin>>a;
cin>>b;
printf("%f",l/(a+b)*a);
}