A:抱歉HDU - 1418
非常抱歉,本来兴冲冲地搞一场练习赛,由于我准备不足,出现很多数据的错误,现在这里换一个简单的题目:
前几天在网上查找ACM资料的时候,看到一个中学的奥数题目,就是不相交的曲线段分割平面的问题,我已经发到论坛,并且lxj 已经得到一个结论,这里就不
多讲了,下面有一个类似的并且更简单的问题:
如果平面上有n个点,并且每个点至少有2条曲线段和它相连,就是说,每条曲线都是封闭的,同时,我们规定:
1)所有的曲线段都不相交;
2)但是任意两点之间可以有多条曲线段。
如果我们知道这些线段把平面分割成了m份,你能知道一共有多少条曲线段吗?
前几天在网上查找ACM资料的时候,看到一个中学的奥数题目,就是不相交的曲线段分割平面的问题,我已经发到论坛,并且lxj 已经得到一个结论,这里就不
多讲了,下面有一个类似的并且更简单的问题:
如果平面上有n个点,并且每个点至少有2条曲线段和它相连,就是说,每条曲线都是封闭的,同时,我们规定:
1)所有的曲线段都不相交;
2)但是任意两点之间可以有多条曲线段。
如果我们知道这些线段把平面分割成了m份,你能知道一共有多少条曲线段吗?
Input输入数据包含n和m,n=0,m=0表示输入的结束,不做处理。
所有输入数据都在32位整数范围内。Output输出对应的线段数目。Sample Input
3 2 0 0Sample Output
3
显而易见,这一题是一个结论,顶点+面数-2=棱数;
int n, m; while(cin>>n>>m) { if(n==0&&m==0)break; cout<<n+m-2<<' '; }
B - {A} + {B} HDU - 1412
很简单,考点就是去重,这里用set或者unique去重都可以,唯一容易PE的就是格式最后一个没有空格;
1 while(cin>>n>>m){//unique去重;
2 for(int i=0;i<n+m;i++)cin>>a[i];
3 sort(a,a+n+m);
4 int t=unique(a,a+n+m)-a;
5 cout<<a[0];
6 for(int i=1;i<t;i++)cout<<" "<<a[i];
7 cout<<'
';
8 }
1 while(cin>>n>>m){//set去重 2 set<int>s; 3 for(int i=0;i<n+m;i++){ 4 int t;cin>>t; 5 s.insert(t); 6 } 7 8 for(auto t=s.begin();t!=s.end();t++){ 9 if(t==s.begin())cout<<*t; 10 else cout<<" "<<*t; 11 } 12 cout<<' '; 13 }
C - 钱币兑换问题
一个简单的完全背包问题没什么好说的
1 2 int n; 3 f[0]=1; 4 for(int j=1;j<=3;j++){ 5 for(int i=1;i<=32768;i++){ 6 f[i]=max(f[i],f[i]+f[i-j]); 7 } 8 } 9 while(cin>>n){ 10 cout<<f[n]<<' '; 11 }