|
常用链接
留言簿(4)
随笔分类
随笔档案
搜索
最新评论

阅读排行榜
评论排行榜
Powered by: 博客园
模板提供:沪江博客
|
|
|
|
|
发新文章 |
|
|
传说中的暴力搜索。。。 直接双重循环。。。
#include"stdio.h"
 struct rec {
int x1,x2,y1,y2;
}rec [5001];
bool cover(int i,int j)
 {
if((rec[i].x1>=rec[j].x1)&&(rec[i].x2<=rec[j].x2)&&(rec[i].y1>=rec[j].y1)&&(rec[i].y2<=rec[j].y2))return true;
else return false;
}

int main()
  {
int n,i,k,j;
while(scanf("%d",&n)!=EOF)
 {
k=0;
for(i=1;i<=n;i++)
scanf("%d%d%d%d",&rec[i].x1,&rec[i].x2,&rec[i].y1,&rec[i].y2);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
 if(i!=j&&cover(i,j)) {k++;break; }
printf("%d\n",k);
}

}
摘要: 类似手机智能英文输入法我的算法很复杂,虽然在自己电脑上实现了,但是在OD上居然出现了runtime error。。。先把说有输入的单词按使用频率排序,然后根据输入数字逐个查找。。用了n个循环。。。
#include <iostream>#include <vector>#include <string>#include ... 阅读全文
2个球,大小同,其中一个重量不同。现有一个天平,要用这个天平称3次找出这个不同重量的球,如何称?
将所有球编号为1-12; 第一步,将1-4号放左边,5-8号放右边: 若倾斜,假设右重(左重雷同): 第二步[0],将2-4移走,6-8移入左边,9-11移入右边: 若仍倾斜,则不同的那个为编号1或5号: 第三步[0][0],将1号与2号比较,若相等,则5号偏重,反之,2号球偏轻; 若不倾斜,则不同的那个在编号2-4中,且偏轻; 第三步[0][1],任取2-4种两球可得结果; 若不倾斜,则不同的在9-12中: 第二步[1],移走6-8球,移入9-11球: 若倾斜,假设右重(左重雷同): 第三步[1][0],任取9-11种两球可得结果; 若不倾斜,则12号球异常: 第三步[1][1],将12号球与其它任意球比较可知是轻是重;
类似冒泡程序 如果所有人是线性排列,那我们的工作就是类似冒泡程序做的工作:1,2,3,4,5变为5,4,3,2,1 ,耗时n(n-1)/2 但是出现了环,也就是说1,2,3,4,5变为3,2,1,5,4也可满足条件 我们可以把这个环等分成两个部分 ,每个部分看成是线性的,再把它们花的时间加起来. 当n是偶数时, 每份人数n/2 ,即 2*(n/2 )*(n/2 -1)/2; 当n是奇数时,两份的人数分别是n/2和n/2+1,即(n/2)*(n/2 -1)/2 + (n/2 +1)*(n/2)/2 ; 这思路太强了。。。
#include <iostream>
#include <vector>
#include <string>
#include <math.h>
using namespace std;


int main()
  {
int n,num,rnum;
vector<int> re;
cin>>n;
while (n>0)
 {
cin>>num;
if (num%2==0)
 {
rnum=(num/2-1)*(num/2)*2/2;
re.push_back(rnum);
}
if (num%2==1)
 {
rnum=(num/2-1)*(num/2)/2+ (num/2+1)*(num/2)/2;
re.push_back(rnum);
}
n--;
}
for (size_t i=0;i<re.size();i++)
 {
cout<<re[i]<<endl;
}
}
这是我同学的思路,比我的好多了。。。
一次判断各球的重量,如假设轻,若在重的一边或平衡端出现则假设错
Source Code

Problem: 1013 User: lnmm
Memory: 64K Time: 0MS
Language: C++ Result: Accepted

Source Code
#include"stdio.h"
#include"string.h"
char left[3][7],right[3][7],result[3][5];

bool isHeavy(char x )
  {
int i;
for(i=0;i<3;i++)
 {
switch(result[i][0])
 {
case 'u':if(strchr(left[i],x)==NULL)return false;break;
case 'e':if(strchr(left[i],x)!=NULL||strchr(right[i],x)!=NULL)return false;break;
case 'd':if(strchr(right[i],x)==NULL)return false;break;
}
}
return true;
}

bool isLight(char x )
  {
int i;
for(i=0;i<3;i++)
 {
switch(result[i][0])
 {
case 'u':if(strchr(right[i],x)==NULL)return false;break;
case 'e':if(strchr(left[i],x)!=NULL||strchr(right[i],x)!=NULL)return false;break;
case 'd':if(strchr(left[i],x)==NULL)return false;break;
}
}
return true;
}

void main()
  {
int n;
char c;
int i;
scanf("%d",&n);
while(n>0)
 {
for( i=0;i<3;i++)
scanf("%s%s%s",left[i],right[i],result[i]);
for(c='A';c<='L';c++)
 {
if(isLight(c))
 {
printf("%c is the counterfeit coin and it is light.\n",c);
break;
}
if(isHeavy(c))
 {
printf("%c is the counterfeit coin and it is heavy.\n",c);
break;
}

}
n--;

}
}

输入三个数m,a,b,求出p,q使得a/b<=p/q<=1且p*q<m时,p,q的最大值 我是先求出sqrt(99999)中的所有质数,然后通过2个循环求出相应条件的极值 我不知道为啥错,反正自己电脑上是可以出来的。。。
#include <iostream>
#include <vector>
#include <string>
#include <math.h>
using namespace std;

vector<int> prime; //存储质数

void prim()
  {
bool pr;
for (int i=(int)sqrt((double)99999);i>1;i--)
 {
pr=true;
for (int j=(int)sqrt((double)i);j>1;j--)
 {
if (i%j==0)
 {
pr=false;
break;
}
}
if (pr==true)
 {
prime.push_back(i);
}
}
}
int main()
  {
int m;prim();
double a,b;
while (scanf("%d %lf %lf",&m,&a,&b)!=EOF)
 {
if (m==0&&a==0&&b==0)
 {
break;
}
if(m<=4||a>b||m>100000||a>1000||b>1000||a<1||b<1)
 {
break;
}
int p,q,pmax=0,qmax=0;
double ratio=a/b;
for (int i=0;i<prime.size();i++)
 {
if (prime[i]>m/2)
 {
continue;
}
if(prime[i]<=m/2)
 {
for (int j=i;j<prime.size();j++)
 {
p=prime[j];
q=prime[i];

double newratio=(double)p/(double)q;
if (newratio<ratio||p*q>=m)
 {
continue;
}
if (p*q>pmax*qmax&&newratio>=ratio)
 {
pmax=p;
qmax=q;
}
}
}
}
cout<<pmax<<" "<<qmax<<endl;
}
}
|
|