#include<iostream>
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int main()
{
int m,n;
scanf("%d%d",&m,&n);
int ar[m][n];
int sum=0;
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
scanf("%d",&ar[i][j]);
}
sort(ar[i], ar[i]+n);
sum+=*(ar[i]+n-1);
}
printf("%d",sum);
return 0;
}
/**************************************************************
Problem: 1112
User: 2021035552
Language: C++
Result: 正确
Time:0 ms
Memory:1712 kb
****************************************************************/
题目描述
在N行M列的正整数矩阵中,要求从每行中选出1个数,使得选出的总共N个数的和最大。
已知1< =N< =10, 1< =M< =10
输入
输入数据有多行,第一行是矩阵的行数N和列数M
接下来的N行M列为输入数据(正整数,不超过10000)
输出
输出N行元素和的最大值。
样例输入 Copy
3 3 1 2 3 4 5 6 7 8 9
样例输出 Copy
18
问题 A: 和最大
#include<iostream>
#include<cstdio>
using namespace std;
int n,aid,a[105],tot=0,sum=0,you;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
{
scanf("%d",&a[i]);
tot+=a[i];
}
aid=tot/n;
//////
for(int i=1;i<=n-1;++i)
{
if(a[i]-aid<0)
{
a[i+1]+=a[i]-aid;
sum++;
}
if(a[i]-aid>0)
{
a[i+1]+=a[i]-aid;
sum++;
}
}
printf("%d",sum);
return 0;
}
/**************************************************************
Problem: 1113
User: 2021035552
Language: C++
Result: 正确
Time:0 ms
Memory:1712 kb
****************************************************************/
题目描述
有 N 堆纸牌,编号分别为 1,2,…, N。每堆上有若干张,但纸牌总数必为 N 的倍数。可以在任一堆上取若干张纸牌,然后移动。
移牌规则为:在编号为 1 堆上取的纸牌,只能移到编号为 2 的堆上;在编号为 N 的堆上取的纸牌,只能移到编号为 N-1 的堆上;其他堆上取的纸牌,可以移到相邻左边或右边的堆上。
现在要求找出一种移动方法,用最少的移动次数使每堆上纸牌数都一样多。
例如 N=4,4 堆纸牌数分别为: ① 9 ② 8 ③ 17 ④ 6
移动3次可达到目的:
从 ③ 取4张牌放到④(9 8 13 10)->从③取3张牌放到 ②(9 11 10 10)-> 从②取1张牌放到①(10 10 10 10)。
输入
N(N 堆纸牌,1 <= N <= 100)
A1 A2 … An (N 堆纸牌,每堆纸牌初始数,l<= Ai <=10000)
输出
所有堆均达到相等时的最少移动次数。
样例输入 Copy
4 9 8 17 6
样例输出 Copy
3
问题 B: 分牌
#include<stdio.h>
#include<algorithm>
using namespace std;
struct Time
{
int start;
int end;
}a[10001];
int cmp(Time x,Time y)
{
return x.end<=y.end;
}
int main()
{
int t;
int n,i,s,ans=1;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d%d",&a[i].start,&a[i].end);
sort(a,a+n,cmp);
s=a[0].end;
for(i=1;i<n;i++)
{
if(a[i].start>=s)
{
s=a[i].end;
ans++;
}
}
printf("%d\n",ans);
return 0;
}
/**************************************************************
Problem: 1117
User: 2021035552
Language: C++
Result: 正确
Time:0 ms
Memory:1168 kb
****************************************************************/
题目描述
学校在最近几天有n个活动,这些活动都需要使用学校的大礼堂,在同一时间,礼堂只能被一个活动使。由于有些活动时间上有冲突,学校办公室人员只好让一些活动放弃使用礼堂而使用其他教室。
现在给出n个活动使用礼堂的起始时间bi和结束时间ei(bi < ei<=32767),请你帮助办公室人员安排一些活动来使用礼堂,要求安排的活动尽量多。
输入
第一行一个整数n(n<=1000); 接下来的n行,每行两个整数,第一个bi,第二个是ei(bi < ei<=32767)
输出
输出最多能安排的活动个数
样例输入 Copy
11 3 5 1 4 12 14 8 12 0 6 8 11 6 10 5 7 3 8 5 9 2 13
样例输出 Copy
4
问题 C: 活动选择
#include <iostream>
#include <string>
using namespace std;
int main()
{
string n;
int a;
while(cin>>n>>a)
{
while(a--)
{
int i=0;
while(n[i]<=n[i+1])
i++;
n.erase(i,1);
}
int i=0;
for(i;i<n.size();i++)
if(n[i]!='0')
break;
for(i;i<n.size();i++)
cout<<n[i];
cout<<endl;
}
return 0;
}
/**************************************************************
Problem: 1114
User: 2021035552
Language: C++
Result: 正确
Time:0 ms
Memory:1712 kb
****************************************************************/
题目描述
输入一个高精度的正整数N,去掉其中任意S个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的N和S,寻找一种方案使得剩下的数字组成的新数最小。
输出新的正整数。(N不超过240位)输入数据均不需判错。
输入
n
s
输出
最后剩下的最小数。
样例输入 Copy
175438 4
样例输出 Copy
13
问题 D: 删数问题
#include <iostream>
#include <algorithm>
using namespace std;
struct bi
{
long long m,xjb;
int s;
};
bool cmp(bi a,bi b)
{
return a.xjb<b.xjb;
}
int main()
{
bi a[5]={0};
for(int i=1;i<=4;i++)
cin>>a[i].m;
long long n;
cin>>n;
n*=100;
a[1].s=25;a[2].s=50;
a[3].s=100;a[4].s=200;
a[1].xjb=a[1].m*8;
a[2].xjb=a[2].m*4;
a[3].xjb=a[3].m*2;
a[4].xjb=a[4].m;
sort(a+1,a+5,cmp);
long long sum=0;
for(int i=1;i<=4;i++)
{
sum+=n/a[i].s*a[i].m;
n=n%a[i].s;
if(n==0)
break;
}
cout<<sum<<endl;
return 0;
}
/**************************************************************
Problem: 1175
User: 2021035552
Language: C++
Result: 正确
Time:0 ms
Memory:1716 kb
****************************************************************/
150
提示
买1瓶2升的饮料和2瓶0.5升的饮料。 这样正好可以买到3升饮料,花费是 90+30+30=150 元。
问题 E: 便利店
#include <cstdio>
#include <algorithm>
using namespace std;
struct node
{
int start;
int end;
}a[100];
int compare(node a,node b)
{
return a.end<b.end;
}
int main()
{
int n,i,f,flag;
while(scanf("%d",&n)&&n)
{
f=1;
for(i=0;i<n;i++)
{
scanf("%d%d",&a[i].start,&a[i].end);
}
sort(a,a+n,compare);
flag=a[0].end;
for(i=1;i<n;i++)
{
if(a[i].start>=flag)
{
f++;
flag=a[i].end;
}
}
printf("%d\n",f);
}
}
/**************************************************************
Problem: 1125
User: 2021035552
Language: C++
Result: 正确
Time:0 ms
Memory:1092 kb
****************************************************************/
题目描述
假期到了,天宝终于可以无压力的看电视了。但是他喜欢的节目有点多,如何尽可能多的看到完整的节目。
他把喜欢的节目时间表给你,请帮他安排一下吧。
输入
输入包含多组测试数据。每组输入的第一行是一个整数n(n<=100),表示天宝喜欢的节目的总数。
接下来n行,每行输入两个整数si和ei(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
问题 F: 节目安排
#include<iostream>
#include<string>
using namespace std;
bool compare(string a,string b)
{
if(a+b>=b+a)//ab>=ba,这个时候不需要交换
{
return false;
}
return true;//ab<ba,这个时候需要交换
}
int main()
{
int n;
cin>>n;
string arr[20],temp;
for(int a=0;a<n;a++)
{
cin>>arr[a];
}
for(int i=0;i<n-1;i++)
{
for(int j=n-1;j>i;j--)
{
if(compare(arr[j-1],arr[j])) //如果为true则交换,
{
temp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=temp;
}
}
}
for(int k=0;k<n;k++){
cout<<arr[k];
}
cout<<endl;
return 0;
}
/**************************************************************
Problem: 1119
User: 2021035552
Language: C++
Result: 正确
Time:0 ms
Memory:1712 kb
****************************************************************/
题目描述
设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数。 例如:n=3时,3个整数13,312,343联接成的最大整数为:34331213 又如:n=4时,4个整数7,13,4,246联接成的最大整数为:7424613
输入
输入格式如下: 第一行为正整数n,第2行为n个正整数,2个正整数之间用空格间隔。
输出
输出n个数连接起来的最大整数
样例输入 Copy
3 13 312 343
样例输出 Copy
34331213
问题 G: 最大整数
#include<iostream>
using namespace std;
int a[1005],b[1005],ans;
int main(){
int i=0,t=0;
while(cin>>a[i]){
i++;
}
while(t!=i+1){
ans++;
int Max=60000;
for(int j=0;j<=i;j++){
if(!b[j]&&a[j]<=Max){
Max=a[j];
b[j]=1;
t++;
}
}
}
cout<<ans<<endl;
return 0;
}
/**************************************************************
Problem: 1115
User: 2021035552
Language: C++
Result: 正确
Time:0 ms
Memory:1720 kb
****************************************************************/
题目描述
某国为了防御敌国的导弹袭击,开发出一种导弹拦截系统,但是这种拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度。某天,雷达捕捉到敌国的导弹来袭,由于该系统还在试用阶段。所以一套系统有可能不能拦截所有的导弹。
输入导弹依次飞来的高度(雷达给出的高度不大于30000的正整数)。计算要拦截所有导弹最小需要配备多少套这种导弹拦截系统。
输入
n颗依次飞来的高度(1≤n≤1000)
输出
要拦截所有导弹最小配备的系统数k
样例输入 Copy
389 207 155 300 299 170 158 65
样例输出 Copy
2
提示
输入:导弹高度: 7 9 6 8 5
输出:导弹拦截系统K=2
输入:导弹高度: 4 3 2
输出:导弹拦截系统K=1
本文探讨了多种算法的实际应用,包括快速排序、选择排序以及活动安排和导弹拦截策略。通过实例展示了如何在限定条件下最大化效益,如选择每行最大数、最短时间完成任务和最小化导弹拦截系统数量。同时,还涉及了数据结构的运用,如动态规划和贪心算法。
838

被折叠的 条评论
为什么被折叠?



