https://codeforces.com/contest/1530/problem/A
题意:给你一个整数n问你最少需要用多少个二进制数可以组成n这个整数。
思路:找到n里位数最大的那位,输出就行了。
代码:
#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define hh 0x3f3f3f3f
const int MAXX=2e5+5;
using namespace std;
inline int read()
{
ll s=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
return s*f;
}
void solve()
{
int n,maxx=1;
cin>>n;
while(n)
{
int temp=n%10;
maxx=max(maxx,temp);
n/=10;
}
cout<<maxx<<endl;
}
int main()
{
ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
https://codeforces.com/contest/1530/problem/B
B. Putting Plates
题意:给你一个n行m列的二维矩阵,i==1或者i==n或者j==1或者j==m时才有可能放下一个餐桌,餐桌的上下左右,右上 右下 左上 左下(8个方向)都不能有桌子。
思路:染色法,用一个二维数组pd[][]来判断当前的位置是否已经被染色,如果被染色了那么就进入下一层循环,否则在该位置放置一个餐桌并将其自身以及其周围的八个方向进行染色。
代码:
#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define hh 0x3f3f3f3f
const int MAXX=2e5+5;
using namespace std;
inline int read()
{
ll s=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
return s*f;
}
int f[30][30],pd[30][30];
int dx[10]={0,0,0,1,1,1,-1,-1,-1};
int dy[10]={0,1,-1,0,1,-1,0,1,-1};
void solve()
{
int n,m;
cin>>n>>m;
for(int i=0;i<=25;i++)//初始化
{
for(int j=0;j<=25;j++)
{
f[i][j]=0;pd[i][j]=0;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(i==1||j==1||i==n||j==m)//判断是否符合题意
{
if(pd[i][j]==1)continue;//如果该位置被染色了那么就进入下一层循环
f[i][j]=1;//放置一个餐桌
for(int k=0;k<=8;k++)//将该位置以及其周围的八个方向都进行染色
{
int xx=i+dx[k];
int yy=j+dy[k];
pd[xx][yy]=1;
}
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cout<<f[i][j];
}
cout<<endl;
}
}
int main()
{
ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
int t;
cin>>t;
while(t--)
{
solve();
}
return 0;
}
https://codeforces.com/contest/1530/problem/C
C. Pursuit
题意:每次给你两组数据,一组是自己的得分另一组是Ilya的得分,问我最少要新增多少场比赛才能够追上llya的分,每次都剔除(总场数/4)场最低分的比赛,剩下的就是各自的最终得分。请你输出增添场数的最小值。
思路:最少添加场数接下来一定是我每场都拿100分llya每次都是零分,用二分答案的方法来。但是注意的是,我们要理清楚剔除的次数和添加场数的关系,对于我来说我每次肯定都是从头开始剔除最小得分,对于llya来说得看剔除次数,如果增加场数比剔除的次数大,那么就是一种情况,如果是后者比较大,我们就要考虑llya从小剔除的次数。
#include<bits/stdc++.h>
#define ll long long
#define rep(a,b,c) for(int a=b;a<=c;a++)
#define per(a,b,c) for(int a=b;a>=c;a--)
#define hh 0x3f3f3f3f
const int MAXX=1e5+5;
using namespace std;
inline int read()
{
ll s=0,f=1;
char c=getchar();
while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){s=(s<<3)+(s<<1)+c-'0';c=getchar();}
return s*f;
}
int a[MAXX],b[MAXX],n;
bool check(int x)//x表示新增的场数
{
int s_a=0,s_b=0,top,k;
for(int i=1;i<=n;i++)//先对A,B的值加起来
{
s_a+=a[i];
s_b+=b[i];
}
s_a+=x*100;//A要加上新增的场数的得分
k=(n+x)/4;//剔除的场数
if(x-k>=0)//如果增加的场数>=剔除的场数
{
for(int i=1;i<=k;i++)//我们不用对B处理,只用处理A。
{
s_a-=a[i];
}
if(s_a>=s_b)return 1;
else return 0;
}
else//剔除场数>新增场数
{
for(int i=1;i<=k;i++)s_a-=a[i];//我们处理A的剔除次数
//因为新增的数组里,B每次比赛都是0分,因此我们优先剔除0分的场数,再剔除B之前从小到大的排序的场数
//b需要剔除的次数就是(总剔除次数-新增场数)k-x
for(int i=1;i<=k-x;i++)s_b-=b[i];
if(s_a>=s_b)return 1;
else return 0;
}
}
int main()
{
ios::sync_with_stdio(0);cout.tie(0);cin.tie(0);
int t;
cin>>t;
while(t--)
{
int ans=MAXX;
for(int i=1;i<=n;i++)a[i]=0,b[i]=0;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
sort(a+1,a+1+n);
sort(b+1,b+1+n);
int l=0,r=n,mid;
while(l<=r)
{
mid=(l+r)/2;
if(check(mid))
{
ans=mid;
r=mid-1;
}
else l=mid+1;
}
cout<<ans<<endl;
}
return 0;
}