问题 A: yangftc的时间安排
题目描述
yangftc需要安排他的时间,有很多事情做,每个事情都有固定的开始和结束时间,因为yangftc每次只能做一件事情,如果有两个或者多个事情的时间重合了那么他就会说 NO,否则他就会说 YES 。
输入
第一个数字t代表样例数量,
后面t个样例,每个样例输入一个n表示事情的数量,后面n行每行两个数字l r表示这个事情的开始和结束时间;
输出
判断yangftc会说什么 YES或者 NO 。
数据范围 1<=t<=500 1<=n<=100 1<=l<=r<=100000
样例输入 Copy
2
3
1 3
4 5
6 7
2
1 3
3 4
样例输出 Copy
YES
NO
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
struct Activity{
int s;
int f;};
int cmp(Activity &a,Activity &b){
return a.s<=b.s;}//开始时间升序排序,也可以按结束时间
int main()
{
int t;//实例个数
while(cin>>t){
while(t--){
int n;//事情件数
cin>>n;
Activity a[n];
for(int i=0;i<n;i++){
cin>>a[i].s;
cin>>a[i].f;
}
sort(a,a+n,cmp);
int flag=0;
for(int i=0;i<n;i++){
for(int j=i+1;j<n;j++){
if(a[i].f>=a[j].s){flag=1;break;}
}
}
if(!flag){ cout<<"YES"<<endl;}
else{ cout<<"NO"<<endl;}
}
}
return 0;
}
自守数
题目描述
自守数是指一个数的平方的尾数等于该数自身的自然数。例如:25^2 = 625,76^2 = 5776,9376^2 = 87909376。请求出n以内的自守数的个数。
输入
int型整数。
输出
n以内自守数的数量。
样例输入 Copy
2000
样例输出 Copy
8
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int fun(int i){
long long int x=(long long int)i*i;//注意这里是关键
while(i>0){
if(x%10==i%10){
x/=10;
i/=10;
}
else{return 0;break;}
}
return 1;
}
int main()
{
int n;
while(~scanf("%d",&n)){
int sum=0;
for(int i=0;i<=n;i++){
//int p=pow(i,2);
//int w=weishu(i);
//int t=(int)pow((double)10,(double)w);
//printf("%d\n",p);
if(fun(i)==1){sum++; }
}
printf("%d\n",sum);
}
return 0;
}
相聚HNUCM校园食堂
题目描述
HNUCM的食堂重新装修了,小明决定约上朋友去食堂相聚,在食堂里,小明看到了M位男同学,N位女同学,小明是一个颜值控,因此他对每一位男生和女生都有一个颜值打分,他心里yy着想为这些单身狗们进行配对,小明真是一个关心同学的人!但小明认为配对同学的颜值之差不能超过5,注意必须是一位男同学和一位女同学才能配对,虽然小明对于可以配对的人数已经有了答案,但他想考考你的编程能力,因此他想请你帮他用编程算一下最多可以配对多少个人。(本题介绍仅作题目背景使用,无任何其他观点)
输入
每个测试文件仅有一条测试数据。
第一行输入M,N,分别表示男同学的数量,女同学的数量。(1<=M<=100,1<=N<=100)
第二行输入M个正整数,分别表示男同学们的颜值。
第三行输入N个正整数,分别表示女同学们的颜值。
注意,所有人的颜值分数范围在[1,100]
输出
输出最多可以配对的总人数。
样例输入 Copy
5 4
10 65 23 67 80
5 15 60 90
样例输出 Copy
4
提示
样例中第一位男同学和第一位女同学配对,第二位男同学和第三位女同学配对。
#include<bits/stdc++.h>
using namespace std;
bool cmp(int a,int b){
return a<b;
}
int main()
{
int M,N;
while(cin>>M>>N){
int a[M];
int a1[M];
int c=0;
memset(a1,0,sizeof(a1));//初始化
int b[N];
int b1[N];
memset(b1,0,sizeof(b1));//初始化
for(int i=0;i<M;i++){
cin>>a[i];
}
for(int i=0;i<N;i++){
cin>>b[i];
}
sort(a,a+M,cmp);//一定要排序
sort(b,b+N,cmp);
for(int i=0;i<M;i++){
for(int j=0;j<N;j++){
if(abs(a[i]-b[j])<=5&&!a1[i]&&!b1[j]){
a1[i]=1;b1[j]=1;c++;
}
}
}
cout<<c*2<<endl;
}
return 0;
}
问题 F: 简单递归求和
题目描述
使用递归编写一个程序求如下表达式前n项的计算结果: (n<=100)
1 - 3 + 5 - 7 + 9 - 11 +…
输入n,输出表达式的计算结果。
输入
多组输入,每组输入一个n,n<=100。
输出
输出表达式的计算结果。
样例输入 Copy
1
2
样例输出 Copy
1
-2
#include <stdio.h>
#include <stdlib.h>
int fun(int n){
if(n==1){return 1;}
if(n%2==0){return fun(n-1)-(2*n-1);}
if(n%2!=0){return fun(n-1)+(2*n-1);}
}
int main()
{
int n;
while(~scanf("%d",&n)){
int p=fun(n);
printf("%d\n",p);
}
return 0;
}
问题 H: 递归求和
使用递归编写一个程序求如下表达式的计算结果: (1<n<=20)
S(n) = 14 + 49 + 916 + 1625 + … + ((n-1)2)*n2
输入n,输出表达式S(n)的结果。
输入
单组输入,输入一个正整数n,1<n<=20。
输出
输出表达式S(n)的计算结果。
样例输入 Copy
3
样例输出 Copy
40
#include <stdio.h>
#include <stdlib.h>
int fun(int n){
if(n==1){return 0;}
return fun(n-1)+(n-1)*(n-1)*n*n;
}
int main()
{
int n;
while(~scanf("%d",&n)){
int p=fun(n);
printf("%d\n",p);
}
return 0;
}
问题 G: 文件存储
题目描述
如果有n个文件{F1,F2,F3,…,Fn}需要存放在大小为M的U盘中,文件i的大小为Si,1<=i<=n。请设计一个算法来提供一个存储方案,使得U盘中存储的文件数量最多。
输入
多组输入,对于每组测试数据,每1行的第1个数字表示U盘的容量M(以MB为单位,不超过256*1000MB),第2个数字表示待存储的文件个数n。
第2行表示待存储的n个文件的大小(以MB为单位)。
输出
输出最多可以存放的文件个数。
样例输入 Copy
10000 5
2000 1000 5000 3000 4000
样例输出 Copy
4
#include<bits/stdc++.h>
using namespace std;
int main()
{
int M,n;
while(cin>>M>>n){
int a[n];
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int c=0;
for(int i=0;i<n;i++){
if(a[i]<=M){
c++;
M-=a[i];
}
}
cout<<c<<endl;
}
return 0;
}
问题 I: 最大收益(部分背包)
题目描述
小X是一位精明的投资人,他每次都能够做出正确的投资判断。
现在有N个项目,每个项目的总投资额和总收益已知,并且每一个项目都允许小X只投资一部分,当然也就只能拿到一部分收益。
现在小X决定拿出M万元钱来进行投资,请你帮他设计一个算法来计算最大收益和。
输入
单组输入,对于每一组数据,第1行包含两个正整数,分别是M和N,其中M<=10^6,N<=100。
接下来N行每行均包含两个正数(不一定是正整数),第1数字表示第N个项目的总投资额(万元),第2个数字表示第N个项目的总收益(万元),两个数字之间用空格隔开。
输出
小X可以获得的最大收益和(万元,结果四舍五入保留两位小数)。
样例输入 Copy
100 4
50 10
20 10
40 10
50 20
样例输出 Copy
37.50
#include<bits/stdc++.h>
using namespace std;
struct TOU{
double w;
double v;
double vw;};
TOU t[105];
int cmp(TOU &a,TOU &b){
return a.vw>b.vw;}
int main()
{
double M;
int N;
while(cin>>M>>N){
for(int i=0;i<N;i++){
cin>>t[i].w>>t[i].v;
t[i].vw=t[i].v/t[i].w;
}
sort(t,t+N,cmp);
double value=0;
int i=0;
while(t[i].w<=M&&i<N){
M-=t[i].w;
value+=t[i].v;
i++;
}
if(i<N){
value+=M*t[i].vw;
}
cout<<setiosflags(ios::fixed)<<setprecision(2)<<value<<endl;
}
return 0;
}
问题 J: 排列蛋卷
题目描述
刚考完研的TC同学这段时间在家闲得慌,因此他决定学点新手艺。今天他学习的内容是:做蛋卷。
由于是第一次做蛋卷,TC同学做出来蛋卷长短不一。看着这些长度都不一样的蛋卷,TC同学的强迫症又犯了。他希望能够拿出其中部分蛋卷,使得留下来的蛋卷能够按照长度从大到小的次序排列。
请问他最少需要拿出多少根蛋卷?
输入
单组输入,对于每一组测试数据,第1行N表示蛋卷的总数量(n<=1000)。
第2行包含N个正整数,分别表示每一根蛋卷的长度。(单位:厘米)
保证在同一组输入数据中每一根蛋卷的长度均不一样。
输出
输出最少需要拿出的蛋卷数量。
样例输入 Copy
5
15 18 17 11 12
样例输出 Copy
2
#include <iostream>
using namespace std;
int main()
{
int n;
while(cin>>n){
int a[n+1];
int b[n+1];
for(int i=1;i<=n;i++){
cin>>a[i];
}
b[1]=1;
for(int i=2;i<=n;i++){
int maxx=0;
for(int j=i-1;j>0;j--){
if(a[j]>a[i]&&b[j]>maxx){
maxx=b[j];
}
}
b[i]=maxx+1;
}
int maxx2=b[1];
for(int i=2;i<=n;i++){
if(b[i]>maxx2){maxx2=b[i];}
}
int p=n-maxx2;
cout<<p<<endl;
}
return 0;
}