ZOJ_3681_E - Cup 2

看到acdream群裏面有朋友問到這題,於是看了一下

一開始還沒看懂,後面才理解題意

題目意思是這樣的 

爲了製造italy支持率高的假象

於是刻意安排合適分組以實現調查數據虛高的目的

樣例12 5

結果是12 6

正確的分組方法應該是這樣的

3 2:1    
3 2:1
3 2:1
3 0:3

如此一來就有三個組別支持italy

問題沒有這麼簡單

接下來的問題是還可以分組的要繼續分組

比如16, 你可以氛圍四組,也可以繼續再分為兩組於是乎這題變為了求約數

#include <iostream>
#include <stdio.h>
#include <map>
#include <algorithm>
#include <string.h>

using namespace std;
int l, a[20010];
map<int, int>mp;

int
main()
{
	int n, m;
	while(cin>>m>>n){
		if(m==1){
			if(n==1)
				cout<<"Yes"<<endl;
			else
				cout<<"No"<<endl;
			cout<<"1"<<endl;
			continue;
		}
		int ans=m;
		l=0;
		for(int i=1; i*i<=m; i++){
			if(m%i==0){
				a[l++]=i;
				if(m/i != i)
					a[l++]=m/i;		
			}
		} 
		sort(a, a+l);
		mp.clear();
		for(int i=1; i<l; i++){
			int tmp=a[i]/2 + 1;
			for(int j=1; j<i; j++){
				if(a[i]%a[j]==0){
					int tmp2=mp[a[j]] * mp[a[i]/a[j]];
					if(tmp2<tmp)
						tmp=tmp2;
				}
			}
			mp[a[i]]=tmp;
		}
		ans=mp[m];
		if(ans <= n)
			cout<<"Yes"<<endl;
		else
			cout<<"No"<<endl;
		cout<<ans<<endl;
		
	}
	return 0;
}

转载于:https://my.oschina.net/dianpaopao/blog/145698

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值