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;
	}
}