A. Splitting into digits(暴力)
题目链接:https://codeforces.com/contest/1104/problem/A
题目大意:一个数字n,可以被分解成多少个相同的数字?这些数子di[1,9]
思路:暴力枚举即可;
AC:
int main(){
ll n;
while(cin>>n){
for(int i=9;i>=1;--i){
if(n%i==0){
cout<<n/i<<endl;
for(int j=1;j<=n/i;++j){
cout<<i<<" ";
}
cout<<endl;
break;
}
}
}
}
B. Vasya and Isolated Vertices(规律)
题目链接:https://codeforces.com/contest/1065/problem/B
题目大意:n个顶点,m条边,问这张简单图中最多的孤立点和最少的孤立点是多少个
思路:每个边可以连接两个点,因此只用判断最少的孤立点n和2*m的关系即可;最多的孤立点,前面的图构成完全图,就是(i-1)*i/2个边。然后减去对应的点即可。
AC:
int main(){
ll n,m;
while(cin>>n>>m){
if(n>2*m){
cout<<n-2*m<<" ";
}
else{
cout<<"0 ";
}
ll i;
for(i=0;i<=n&&m>i*(i-1)/2;++i);
cout<<n-i<<endl;
}
}
C. Make It Equal(思维)
题目链接:https://codeforces.com/contest/1065/problem/C
题目大意:给你n堆东西,已知这些东西的高度,一次能铲一层,每次铲走的方块不能多于k个,问最少铲多少次
思路:把高度映射到一个数组中,然后从高处遍历,每次铲掉最多的那个即可。
AC:
int arr[MAXN],sum[MAXN+1];
int main()
{
ll n,k;
while(cin>>n>>k){
clean(arr,0);
clean(sum,0);
for(int i=1;i<=n;++i){
cin>>arr[i];
}
sort(arr+1,arr+n+1);
for(int i=MAXN,j=n;i>=0;--i){
for(;arr[j]>=i&&j>=0;--j);
sum[i]=n-j;
}
ll res=0,ans=0;
for(int i=MAXN;i>arr[1];--i){
if(res+sum[i]<=k)
res+=sum[i];
else{
res=sum[i];
ans++;
}
}
if(res)
ans++;
cout<<ans<<endl;
// for(int i=10;i>=1;--i)
// cout<<sum[i]<<endl;
}
}