目录
随机数
酷酷的单词
0-1背包问题
投资
今年暑假不AC
题目描述
有一个rand(n)的函数,它的作用是产生一个在[0,n)的随机整数。现在有另外一个函数,它的代码如下:
int random(int n, int m)
{
return rand(n)+m;
}
显而易见的是函数random(n,m)可以产生任意范围的随机数。现在问题来了,如果我想要产生范围在[a,b)内的一个随机数,那么对应的n,m分别为多少?
输入
输入的第一行为一个正整数T (T<=1000),表示一共有T组测试数据。
对于每组测试数据包含两个整数a,b (a<=b)。
输出
对于每组测试数据,输出一行包含两个整数n和m,两个整数中间有一个空格分隔。
样例输入 Copy
2 0 5 1 4
样例输出 Copy
5 0 3 1
#include
using namespace std;
int main(){
int n;
while(cin>>n){
while(n--){
int a,b;
cin>>a>>b;
int x,y;
x=b-a;
y=a;
cout<
题目描述
输入一些仅由小写字母组成的单词。你的任务是统计有多少个单词是“酷”的,即每种字母出 现的次数都不同。
比如 ada 是酷的,因为 a 出现 2 次,d 出现 1 次,而 1 和 2 不同。再比如,banana 也是酷的, 因为 a 出现 3 次,n 出现 2 次,b 出现 1 次。但是,bbacccd 不是酷的,因为 a 和 d 出现的次数 相同(均为 1次)。输入
输入包含不超过 30 组数据。每组数据第一行为单词个数 n (1<=n<=10000)。以下 n 行各包含一 个单词,字母个数为 1~30。
输出
对于每组数据,输出测试点编号和酷单词的个数。
样例输入 Copy
2 ada bbacccd 2 illness a
样例输出 Copy
Case 1: 1 Case 2: 0
#include
using namespace std;
int main(){
int n,i;
char s[35];
int a[35];
int t=0;
while(cin>>n)
{
t++;
int ans=0;
while(n--)
{
memset(a,0,sizeof(a));
scanf("%s",s);
int l=strlen(s);
if(l==1)
continue;
for(i=0;i
题目描述
给定n种物品和一个背包,物品i的重量是Wi,其价值为Vi,背包的容量为C。如何选择装入背包的物品,可以使得装入背包中物品的总价值最大?
输入
每组输入包括三行,
第一行包括物品个数n,以及背包容量C。
第二、三行包括两个一维数组,分别为每一种物品的价值和重量。输出
输出包括两行,第一行为背包的最大总价值,第二行为所选取的物品。
例如:最大总价值=15,物品选取策略为11001。样例输入 Copy
5 10 6 3 5 4 6 2 2 6 5 4
样例输出 Copy
15 11001
#include
using namespace std;
int dp[201][201];
int x[201];
int main(){
int n,c;
int i,j;
while(cin>>n>>c){
int v[n],w[n];
int i;
int s=-1;
for(i=0;i>v[i];
}
for(i=0;i>w[i];
}
memset(dp,0,sizeof(dp));
memset(x,0,sizeof(x));
for(j=0;j<=w[n-1]-1;++j){
dp[n-1][j]=0;
}
for(j=w[n-1];j<=c;++j){
dp[n-1][j]=v[n-1];
}
for(i=n-2;i>=0;--i){
for(j=0;j<=c;++j){
if(w[i]<=j){
dp[i][j]=max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]);
}else{
dp[i][j]=dp[i+1][j];
}
}
}
cout<0)
x[n-1]=1;
else
x[n-1]=0;
for(i=0;i
题目描述
某工厂预计明年有A、B、C、D四个新建项目,每个项目的投资额Wk及其投资后的收益Vk如下表所示,投资总额为30万元,如何选择项目才能使总收益最大?
Project
Wk
Vk
A
15
12
B
10
8
C
12
9
D
8
5
输入
无
输出
按顺序输出选择的项目的编号(大写,用空格隔开)
//这个题很尴尬....我用dp报错了,然后我一怒之下就直接输出了...
#include
using namespace std;
int dp[201][201];
int x[201];
int main(){
/** \brief
*
int n=4;
int c=30;
int i,j;
int v[5]={12,8,9,5};
int w[5]={15,10,12,8};
memset(dp,0,sizeof(dp));
for(j=0;j<=w[n-1]-1;++j){
dp[n-1][j]=0;
}
for(j=w[n-1];j<=c;++j){
dp[n-1][j]=v[n-1];
}
for(i=n-2;i>=0;--i){
for(j=0;j<=c;++j){
if(w[i]<=j){
dp[i][j]=max(dp[i+1][j],dp[i+1][j-w[i]]+v[i]);
}else{
dp[i][j]=dp[i+1][j];
}
}
}
//cout<0)
x[n-1]=1;
else
x[n-1]=0;
for(i=0;i
题目描述
“今年暑假不AC?”
“是的。”
“那你干什么呢?”
“看世界杯呀,笨蛋!”
“@#$%^&*%...”
确实如此,世界杯来了,球迷的节日也来了,估计很多ACMer也会抛开电脑,奔向电视了。
作为球迷,一定想看尽量多的完整的比赛,当然,作为新时代的好青年,你一定还会看一些其它的节目,比如新闻联播(永远不要忘记关心国家大事)、非常6+7、超级女生,以及王小丫的《开心辞典》等等,假设你已经知道了所有你喜欢看的电视节目的转播时间表,你会合理安排吗?(目标是能看尽量多的完整节目)输入
输入数据包含多个测试实例,每个测试实例的第一行只有一个整数n(n<=100),表示你喜欢看的节目的总数,然后是n行数据,每行包括两个数据Ti_s,Ti_e (1<=i<=n),分别表示第i个节目的开始和结束时间,为了简化问题,每个时间都用一个正整数表示。n=0表示输入结束,不做处理。
输出
对于每个测试实例,输出能完整看到的电视节目的个数,每个测试实例的输出占一行。
样例输入 Copy
12 1 3 3 4 0 7 3 8 15 19 15 20 10 15 8 18 6 12 5 10 4 14 2 9 0
样例输出 Copy
5
#include
using namespace std;
struct mystruct{
int first;
int last;
};
bool cmp(mystruct a,mystruct b){
return a.last>n&&n)
{
mystruct a[105];
int ans=1;
for(i=0;i>a[i].first>>a[i].last;
}
sort(a,a+n,cmp);
int j=0;
for(i=1;i=a[j].last){
j=i;
ans++;
}
}
cout<