Problem:A 二倍的问题(NEFU OJ 8)
思想:桶排序计数器。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int t;
while(cin >> t)
{
while(t--)
{
int num[20],i=1,j,flag[300]={0};//flag是计数器
int ans=0;
while(cin >> num[i]&&num[i])
i++;
for(j=1;j<i;j++)
flag[2*num[j]]=1;//标记num的2倍
for(j=1;j<i;j++)
{
if(flag[num[j]]==1)//检验是否被标记
ans++;
}
cout << ans << endl;
}
}
return 0;
}
Problem:B 大乐透(NEFU OJ 573)
思想:可以暴力,可以二进制枚举。
解法一,暴力法:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
int a[100];
while(cin >> n)
{
int i1,i2,i3,i4,i5,i6;
if(n==0)
break;
int i;
for(i=1;i<=n;i++)
{
cin >> a[i];
}
sort(a+1,a+1+n);
int t=0;
for(i1=1;i1<=n-5;i1++)
{
for(i2=i1+1;i2<=n;i2++)
{
for(i3=i2+1;i3<=n;i3++)
{
for(i4=i3+1;i4<=n;i4++)
{
for(i5=i4+1;i5<=n;i5++)
{
for(i6=i5+1;i6<=n;i6++)
{
printf("%d %d %d %d %d %d",a[i1],a[i2],a[i3],a[i4],a[i5],a[i6]);
}
}
}
}
}
}
}
return 0;
}
解法二,二进制枚举:
//虽然能一一枚举出来,但是他输出的顺序和答案不一样,所以会WA
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int n;
while(cin >> n&&n)
{
int num[55],i,j;
int ans[55];
for(i=0;i<n;i++)
cin >> num[i];
sort(num,num+n);
for(i=0;i<(1<<n);i++)
{
int tmp=0,k=0;
for(j=0;j<n;j++)
{
if(i&(1<<j))
{
tmp++;
ans[++k]=num[j];
}
}
if(tmp==6)
{
for(int z=1;z<=6;z++)
{
cout << ans[z];
if(z==6)
cout << endl;
else
cout << " ";
}
}
}
}
return 0;
}
Problem:C 密码箱(NEFU OJ 572)
思想:暴力
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin >> n)
{
for(int i=n+1;i<=999;i++)
printf("%03d\n",i);
}
return 0;
}
Problem:D 字符串统计(NEFU OJ 193)
思想:暴力
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin >> n)
{
int i,x;
char a[105];
getchar(); //消去回车
while(n--)
{
int ans=0;
memset(a,0,sizeof(a));
gets(a);
x=strlen(a);
for(i=0;i<x;i++)
if(a[i]>='0'&&a[i]<='9')
ans++;
cout << ans << endl;
}
}
return 0;
}
Problem:E 丑数(NEFU OJ 574)
很难!!
打表尽管跑的很慢QAQ
#include <bits/stdc++.h>
using namespace std;
int num[5880];
int tmp=1;
bool judje(int i)//判断i是不是2,3,5,7组成;
{
while(i%2==0)
{
i/=2;
}
while(i%3==0)
{
i/=3;
}
while(i%5==0)
{
i/=5;
}
while(i%7==0)
{
i/=7;
}
if(i==1)
return 1;
else
return 0;
}
int main()
{
freopen("list.txt", "w", stdout); //打表的关键,去自己文件夹里找
num[1]=1;
for(int i=2;;i++)
{
if(judje(i))
num[++tmp]=i;
if(tmp==5870)
break;
}
for(int i=1;i<=5870;i++)
printf("%d,",num[i]);
return 0;
}
Problem:F 矩形(NEFU OJ 575)
思想:一个一个进行比较(冒泡),注意边界问题。
#include <bits/stdc++.h>
using namespace std;
struct jz{
double minx,maxx;
double miny,maxy;
int flag=0;
}a[10005];
int main()
{
int n;
while(cin >> n)
{
memset(a,0,sizeof(a));
int i,ans=0;
for(i=1;i<=n;i++)
scanf("%lf%lf%lf%lf",&a[i].minx,&a[i].maxx,&a[i].miny,&a[i].maxy);
for(i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
{
if(a[i].minx>=a[j].minx&&a[i].maxx<=a[j].maxx&&a[i].miny>=a[j].miny&&a[i].maxy<=a[j].maxy)
{
a[i].flag=1; //关键:::注意做标记,避免重复判断
a[j].flag=1;
}
}
for(i=1;i<=n;i++)
if(a[i].flag==1)
ans++;
cout << ans << endl;
}
return 0;
}
Problem:G 抽奖(NEFU OJ 1639)
思想:暴力。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n,a[105],flag=0;
cin >> n;
for(int i=1;i<=n;i++)
cin >> a[i];
int t;
cin >> t;
for(int i=1;i<=n;i++)
{
if(a[i]==t)
{
flag=i;
break;
}
}
cout << flag << endl;
return 0;
}
Problem:H 比身高(NEFU OJ 1640)
思想:暴力,注意边界。
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int n,a[1005];
while(cin >> n)
{
int i,ans=0;
for(i=1; i<=n; i++)
cin >> a[i];
for(i=1;i<=n;i++)
{
int ans1=0,ans2=0;
for(int j=1;j<i;j++) //与他之前的进行比较
{
if(a[i]<a[j])
ans1++;
}
for(int j=i+1;j<=n;j++) //与他之后的进行比较
{
if(a[i]<a[j])
ans2++;
}
if(ans1==ans2)
ans++;
}
cout << ans << endl;
}
return 0;
}
Problem:I 楼层编号(NEFU OJ 1642)
思想:暴力,一位一位进行判断,注意什么时候跳出。
#include <bits/stdc++.h>
using namespace std;
int main()
{
int m,t;
while(cin >> m >> t)
{
int sum=0;
int tmp=m,x;
for(int i=1; i<=m; i++)
{
tmp=i;
while(tmp) //每一位进行判断
{
x=tmp%10;
if(x==t)
{
sum++;
break; //及时跳出,否则sum会多加
}
tmp=tmp/10;
}
}
cout << m-sum << endl;
}
return 0;
}
Problem:J 比例简化(NEFU OJ 1643)
思想:暴力,类似于擂台赛。
#include <bits/stdc++.h>
using namespace std;
int gcd(int a,int b) //判断是否互为素数,gcd模板。
{
return b?gcd(b,a%b):a;
}
int main()
{
int a,b,i,j,l,ans1,ans2;
double s1,s2,d,min;
while(cin>>a>>b>>l)
{
min=10000;
for(i=l;i>=1;i--) //循环
{
for(j=l;j>=1;j--)
{
if(gcd(i,j)==1) //判断条件1:A′ 和 B′ 互质,内置gcd函数跑的会慢,若用//__gcd(i,j);
{
s1=1.0*i/j; //暂存即A′和B′
s2=1.0*a/b; //原来d的A与B
if(s1>=s2) //判断条件2:A′/B′≥ A/B
{
d=s1-s2;
if(d<min) //判断条件3:A′/B′-A/B数值尽可能小
{
min=d;
ans1=i;
ans2=j;
}
}
}
}
}
printf("%d %d\n",ans1,ans2);
}
return 0;
}
Problem:K 奶牛碑文(NEFU OJ 1644)
思想:暴力不可取,递推,简单状态转移,类似于动态规划。
设三个变量,分别计算C,CO,COW的个数;遇到C就++;遇到O就加上C的个数;遇到W就加上CO的个数;
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(cin >> n)
{
getchar();
char ch1; //巧妙避开字符串的长度问题,若是字符串,一定要注意范围;
long long b[5]={0};
for(int i=0;i<n;i++)
{
cin >> ch1;
if(ch1=='C'||ch1=='c')
b[1]++;
if(ch1=='O'||ch1=='o')
b[2]+=b[1];
if(ch1=='W'||ch1=='w')
b[3]+=b[2];
}
cout << b[3] << endl;
}
return 0;
}