又是一场和库里布莱恩特的菜鸡互啄,这次还是三星gym,还是两个人一起做,比上次还惨,才6个题。
这场的题感觉很简单,就是有点坑,第二题是多组输入但题里并没有说,骰子那题也是大水题,就是题意难懂,机器人那题也是题目简单,但题意难懂。分块除法,新知识点。BR那题,转化,然后求最大子段和,没想到。还有就是二分,二分真的太好用了。
Gym - 101652Z Forbidden Zero
最简单的一道题,意外拿到了一血。while循环找下一个数,知道找到一个不各个位中不包含0的数,输出即可。
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi=acos(-1.0);
using namespace std;
char s[110];
bool ok(int x)
{
stringstream a;
a<<x;
a>>s;
rep(i,0,strlen(s))
if(s[i]=='0')
return false;
return true;
}
int main()
{
int n;
cin>>n;
while(n++)
{
if(ok(n))
{cout<<n;return 0;}
}
return 0;
}
Gym - 101652N Odd Palindrome
这道题有点迷,感觉题里的描述和AC的代码不符合。直接判断字符串长度就行就AC了......可能是数据太水了吧,谁知道呢
#include <bits/stdc++.h>
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define mes(a, val) memset(a, val, sizeof a)
#define mec(b, a) memcpy(b, a, sizeof a)
string s;
int main()
{
cin>>s;
int n = s.length();
if(n & 1)cout<<"Odd."<<endl;
else cout<<"Or not."<<endl;
return 0;
}
这题本来本简单,就是有一个大bug,就是这道题是多组输入,但是题目中并没有说......
用set或者用数组模拟都行,如果不是Latin Squares的话就输出No,如果是“Latin Squares的话,再判断第一行和第一列是不是升序,如果都是升序的话输出Reduced,否则输出Not Reduced。
贴一下库里布莱恩特的代码(代码风格不忍直视......一条语句还加括号)
#include <bits/stdc++.h>
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string>
using namespace std;
#define LL long long
#define INF 0x3f3f3f3f
#define mes(a, val) memset(a, val, sizeof a)
#define mec(b, a) memcpy(b, a, sizeof a)
const int maxn = 50;
int a[maxn][maxn];
int n;
int visr[maxn], visc[maxn];
set<int>s;
int main()
{
char ch;
while(scanf("%d",&n)!=EOF){
for(int i = 1; i <= n; i ++){
for(int j = 1; j <= n; j ++){
cin>>ch;
if(ch >= '0' && ch <= '9'){
a[i][j] = ch-'0';
}
else if(ch >= 'A' && ch <= 'Z'){
a[i][j] = ch-'A'+10;
}
}
}
int flag = 0;
for(int i = 1; i <= n; i ++){
s.clear();
for(int j = 1; j <= n; j ++){
s.insert(a[i][j]);
}
if(s.size() < n){
// cout<<s.size()<<endl;
flag = 1;break;
}
}
for(int j = 1; j <= n; j ++){
s.clear();
for(int i = 1; i <= n; i ++){
s.insert(a[i][j]);
}
if(s.size() < n){
// cout<<s.size()<<endl;
flag = 1;break;
}
}
if(flag == 1){
cout<<"No"<<endl;
}
else {
flag = 0;
for(int j = 1; j <= n; j ++){
if(a[1][j] != j-1){
flag = 1;break;
}
}
for(int i = 1; i <= n; i ++){
if(a[i][1] != i-1){
flag = 1;break;
}
}
if(flag == 1){
cout<<"Not Reduced"<<endl;
}
else {
cout<<"Reduced"<<endl;
}
}
}
return 0;
}
Gym - 101652Y Delayed Work
要找人装修房子,先要给每个人都支付x工资(与工作时间无关),这项工作一个人做的话需要k天,m个人就需要k/m天,在这k/m天中每人每天要支付p工资。给出k,p,x,问完成这项工作最少需要多少钱。假设找m个人完成这项工作,则需要支付费用m*x+k/m*p,然后由均值不等值的m*x+k/m*p>=2*sqrt(m*x*(k/m*p)),当且仅当m满足m*x==k/m*p时等号成立。所以这个题就是先算m,m必须取整是(因为m是人数),然后为了保险起见,让m+1,m-1都是一遍,看哪个费用少,还有一点,就是k/m可以不是整数,也就是说天数可以不是整数(我也是看了样例才知道的)。
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
int m1,m2,m3;
double mm;
int main() {
int k, p, x;
cin >> k >> p >> x;
mm=sqrt((k*p)*1.0/(x*1.0));
m1=max(int(mm),1);
m2=max(m1+1,1);
m3=max(m1-1,1);
double ans=0;
double d1=(k*1.0/(m1*1.0));
double d2=(k*1.0/(m2*1.0));
double d3=(k*1.0/(m3*1.0));
ans=min(min(m1*x+d1*p,m2*x+d2*p),m3*x+d3*p);
printf("%.3f",ans);
return 0;
}
Gym - 101652X Star Arrangements
给出n表示星号的数目,然后让你写出所有的排列方案。每个排列方案必须满足三个条件:1、每隔一排都有相同数量的星星。2、相邻的排之间的星星数目之差不能超过1。3、第一排不能比第二排少。所以while循环一下一个一个试就行了。
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
int main()
{
int s;
int a,b;
cin>>s;
cout<<s<<":"<<endl;
a=2;
while(a<=s/2+1)
{
b=a-1;
if(s%(a+b)==0||s%(a+b)==a)
cout<<a<<","<<b<<endl;
b=a;
if(s%(a+b)==0||s%(a+b)==a)
cout<<a<<","<<b<<endl;
a++;
}
return 0;
}
哇,实际上这也是个大水题,题读懂了真的超简单。
给出6个数,表示骰子的6个面分别表示每个面朝上的概率,然后你可以改变一个面的值(可以是不是整数,甚至可以是负数),使得抛这个骰子,骰子的值的期望值是3.5,问改变之后的值和变之前的值的差的绝对值最小数多少。所以for循环一个一个试一下就行了......
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
double a[7];
int main()
{
rep(i,1,6)
cin>>a[i];
double sum=0;
rep(i,1,6)
sum+=(i*a[i]);
double ans=inf;
if(sum==3.5)
{cout<<"0.000";return 0;}
rep(i,1,6)
ans=min(ans,abs(3.5-sum)/a[i]);
printf("%.3f",ans);
return 0;
}
二分,还是二分。题意我懒得说了......
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi=acos(-1.0);
using namespace std;
int main()
{
ll n;
cin>>n;
ll l=1,r=n;
ll k=((n-1)*n/2+1)/2;
while(l<=r)
{
ll mid=(l+r)/2;
ll cnt=0;
cnt=(2*n-1-mid)*mid/2;
if(cnt-(n-mid)<k&&cnt>=k)
{cout<<mid;return 0;}
if(cnt<k)
l=mid+1;
else
r=mid-1;
}
return 0;
}
Gym 101652R Straight Shot
哎,题意难懂,读懂了挺简单的,简直就是高一物理题,但还是有一个地方没想起来,vy不会求,哎。
看这个:https://blog.csdn.net/Healer66/article/details/82423757 一看就懂。
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
double l[110],r[110],v[110];
int main()
{
int n;
double X,V;
cin>>n>>X>>V;
rep(i,1,n)
cin>>l[i]>>r[i]>>v[i];
double vy=0;
rep(i,1,n)
vy+=(r[i]-l[i])*v[i];
vy/=X;
if(abs(vy)>=abs(V))
cout<<"Too hard";
else
{
double t=X/(sqrt(V*V-vy*vy));
if(t>=2*X/V)
cout<<"Too hard";
else
printf("%.3f",t);
}
return 0;
}
Gym 101652S Purple Rain
转化一下,求最大字段和,哎,我当时想到转化了,但我以为求最大字段和要n方复杂度,所以就没搞,哎,太菜了。
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi=acos(-1.0);
using namespace std;
char ss[100010];
char s[100010];
int a[100010];
int st1,ed1,st2,ed2;
int main()
{
scanf("%s",ss);
int n=strlen(ss);
rep(i,0,n-1)
s[i+1]=ss[i];
rep(i,1,n)
{
if(s[i]=='B')
a[i]=1;
else
a[i]=-1;
}
int tmp1=1,sum1=0;
int max1=-inf;
rep(i,1,n)
{
sum1+=a[i];
if(sum1>max1)
{
max1=sum1;
st1=tmp1;
ed1=i;
}
if(sum1<0)
{
tmp1=i+1;
sum1=0;
}
}
rep(i,1,n)
{
if(s[i]=='B')
a[i]=-1;
else
a[i]=1;
}
int tmp2=1,sum2=0;
int max2=-inf;
rep(i,1,n)
{
sum2+=a[i];
if(sum2>max2)
{
max2=sum2;
st2=tmp2;
ed2=i;
}
if(sum2<0)
{
tmp2=i+1;
sum2=0;
}
}
if(max1>max2)
{cout<<st1<<" "<<ed1<<endl;return 0;}
if(max2>max1)
{cout<<st2<<" "<<ed2<<endl;return 0;}
if(st1<st2)
{cout<<st1<<" "<<ed1<<endl;return 0;}
if(st2<st1)
{cout<<st2<<" "<<ed2<<endl;return 0;}
if(ed1<ed2)
{cout<<st1<<" "<<ed1<<endl;return 0;}
cout<<st2<<" "<<ed2<<endl;
return 0;
}
题意好懂,不说了。这个用到了分块除法,长知识了。
有篇博客写的不错,可以看一下。https://blog.csdn.net/qq_39599067/article/details/81807580
不过这题有个坑点,就是结果要用unsigned long long来存,因为最终结果可能爆long long。
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<map>
#include<set>
#include<sstream>
#include<cstdlib>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define repp(i,n,a) for(int i=n;i>=a;i--)
#define ll long long
#define ull unsigned long long
#define mem(a,x) memset((a),(x),sizeof ((a)))//x只能是0或-1或false或true
#define debug(x) cout<<"X: "<<(x)<<endl
#define de cout<<"************"<<endl
#define lowbit(x) ((x)&(-x))
#define lson rt<<1
#define rson rt<<1|1
#define gcd(a,b) __gcd(a,b)
#define lcm(a,b) a*b/(__gcd(a,b))
#define inf 0x3f3f3f3f//1e9+6e7
#define eps 1e-8
#define mod 1e9+7
#define N 100010
const double pi = acos(-1.0);
using namespace std;
ull getsum(ll n)
{
ull ret=0;
ull l=1,r=1;
for(l=1;r<=n&&l<=n;l=r+1)
{
r=n/(n/l);
ret+=(n/l)*(r+l)*(r-l+1)/2;
}
return ret;
}
int main()
{
ll a,b;
cin>>a>>b;
cout<<getsum(b)-getsum(a-1);
return 0;
}
太菜了,还是得多刷题啊!