目录
贪心
1.硕鼠交易
/*A与B交易,A共有n元,如果A剩下的钱不够换则按比列换,求A最多能获得多少(结果保留3位小数)*/
//输入 n m(n==-1&&m==-1结束输入)A有n元
//接下来输入m行,每行输入x与y,其中x为花y元获得的东西
#include<bits/stdc++.h>
using namespace std;
struct ALu{
double x,y;
}c[10001];
int n,m;
double sum;
bool _swap(ALu a,ALu b){//按比列排
return (a.x/a.y)>(b.x/b.y);
}
int main()
{
int s;
while(cin>>n>>m){
s=n,sum=0;
for(int i=0;i<m;i++)
cin>>c[i].x>>c[i].y;
sort(c,c+m,_swap);
// for(int i=0;i<m;i++) //检查排序
// cout<<c[i].x<<" "<<c[i].y<<endl;
for(int i=0;i<m;i++)
{
if(s>=c[i].y){ //钱够则全交换
sum+=c[i].x;
s-=c[i].y;
}
else{ //钱不够按比列交换
sum+=(s/c[i].y)*c[i].x;
break;
}
}
printf("%.3lf\n",sum);
if(n==-1&&m==-1){ //循环的结束条件
break;
}
}
return 0;
}
2.田忌赛马
/*田忌赛马*/
//输入n表示要比较的马的数量,如果田忌赢则赢200元,输则扣200元,平则获得0元
//接下来n行每行输入a和b,分别表示田忌的马和对手的马
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
int a[MAX],b[MAX];
int n,sum;
int _sort(int a,int b)
{
return a>b;
}
int main()
{
while(cin>>n){
sum=0;
int k_1=0,k_2=0;
int M_1=n-1,M_2=n-1;
for(int i=0;i<n;i++)
cin>>a[i]>>b[i];
sort(a,a+n,_sort);
sort(b,b+n,_sort);
for(int i=0;i<n;i++) //检查排序
cout<<a[i]<<" "<<b[i]<<endl;
for(int i=0;i<n;i++)
{ //比较快与快,快与慢,慢与慢,慢与快
if(a[k_1]>b[k_2]) k_1++,k_2++,sum+=200;
else if(a[k_1]<b[k_2]) M_1--,k_2++,sum-=200;
else if(a[M_1]>b[M_2]) M_1--,M_2--,sum+=200;
else if(a[M_1]<b[k_2]) M_1--,k_2++,sum-=200;
}
cout<<sum<<endl;
if(n<=0) break;
}
return 0;
}
3.最长事件序列
/*题目描述:已知有n个事件的发生时刻和结束时刻。一些在时间上没有重叠的事件,
可构成一个事件序列,如事件{2,8,10}。事件序列包含事件数目,称为该事件序列
长度。编程找出一个最长的事件序列。*/
//事件编号 0 1 2 3 4 5 6 7 8 9 10 11
//发生时刻 1 3 0 3 2 5 6 4 10 8 15 15
//结束时刻 3 4 7 8 9 10 12 14 15 18 19 20
//样列输入:12
// 3 3 0 1 5 6 4 2 8 10 15 15
// 8 4 7 3 10 12 14 9 18 15 20 19
//样列输出:{3,1,4,9,11}
#include<bits/stdc++.h>
using namespace std;
#define MAX 1001
struct ALu{
int l,r; //l为开始时间,r为结束时间
int num;//num为事件编号
}a[MAX];
int b[MAX];
bool _sort(ALu x,ALu y){
if(x.r<y.r) return true; //结束时间早排前
else if(x.r>y.r) return false;
else{//结束时间相等,则比较开始时间,开始时间晚排前(时间段更短)
if(x.l>y.l) return true;
else return false;
}
}
int n;
int main()
{
while(cin>>n){
for(int i=0;i<n;i++){
a[i].num=i;
cin>>a[i].l;
b[i]=0;
}
for(int i=0;i<n;i++)
cin>>a[i].r;
sort(a,a+n,_sort);//排序
// cout<<endl;
// for(int i=0;i<n;i++)//排序情况
// {
// cout<<a[i].num<<" :"<<a[i].l<<" "<<a[i].r<<endl;
// }
int j=0,t=0;
while(j<n){
if(a[j].l>=t){
b[j]=1;//记录并标记
t=a[j].r;
}
j++;
}
/*输出结果*/
int flag=1;
cout<<"{";
for(int i=0;i<n;i++)
{
if(b[i]==1){
if(flag==1){//第一个前不加","
cout<<a[i].num;
flag=0;
}
else{
cout<<","<<a[i].num;
}
}
}
cout<<"}"<<endl;
if(n<=0) break;//结束条件
}
return 0;
}
4.搬桌子
/*搬桌子:在同一楼层有MAX个房间,小A要从a搬到b,如果有重叠需等上一个搬完再搬,求花的时间*/
//输入一个T,然后输入T组数据
//每组数据先输入1个n,表示搬桌子的情况
//接下来n行输入a和b,分别表示从a房间搬到b房间,每次搬需要10min,分别输出每组所花的时间
/*样列输入:3 样列输出:
4 10
10 20 20
30 40 30
50 60
70 80
2
1 3
2 200
3
10 100
20 80
30 50 */
#include<bits/stdc++.h>
/*MAX为最大的房间号*/
#define MAX 200
using namespace std;
int main()
{
int T,n,c[MAX];
cin>>T;
while(T--){
cin>>n;
memset(c,0,sizeof(c));//初始化
// for(int i=0;i<MAX;i++)
// c[i]=0; //对经过房间号的次数初始化为0
int a,b;
for(int i=0;i<n;i++)
{
cin>>a>>b;
a=a-1;//从下标0开始
b=b-1;
// a=a/2; //a与b对门
// b=b/2;
for(int j=min(a,b);j<=max(a,b);j++){
c[j]++;
}
}
int len=0;
int t=-1;
for(int i=0;i<MAX;i++){
if(c[i]>=t) t=c[i]; // 0 0 0 - 1 2 1 t=2; 0 0 0 - 1 1 1 t=1;
}
cout<<t*10<<endl;
}
return 0;
}
5.删数问题(不包含数字0)
/*已知一个长度不超过240位的正整数n(其中不包含有数字0),
去掉其中任意s(s小于n的长度)个数字后,将剩下的数字按原来
的数字左右次序组成一个新的正整数。给定n和s,请编程输出最
小的新的正整数。*/
//样列输入:178543 4
//样列输出:13
#include<bits/stdc++.h>
using namespace std;
int main()
{
string str;
int s,n;
cin>>str>>s;
n=str.size();
int a[n];
for(int i=0;i<n;i++)
a[i]=str[i]-'0';
// for(int i=0;i<n;i++)//检查
// cout<<a[i]<<" ";
// cout<<endl;
int len=0;//统计删除的数字个数
for(int i=1;i<n;i++)
{
if(a[i-1]>a[i]){ //删除第一个前一个数字比后一个数字大的数(删除第一对逆序对)
len++;
for(int j=i;j<n;j++){
a[j-1]=a[j]; //将数字前移
}
if(len==s){ //删除的位数待到要求退出
for(int i=0;i<n-s;i++)
cout<<a[i];
break;
}
i=1;//对i复位,进行下次对每个数的遍历
}
if(i==n-1){ //该数每一位是升序则删除最后一位a[n-s-1]
for(int i=0;i<n-s;i++)
cout<<a[i];
break;
}
}
return 0;
}
6.删数问题(包含数字0)
/*已知一个长度不超过240位的正整数n(其中包含有数字0),
去掉其中任意s(s小于n的长度)个数字后,将剩下的数字按原来
的数字左右次序组成一个新的正整数。给定n和s,请编程输出最
小的新的正整数。*/
//样列输入:178543 4
//样列输出:13
#include<bits/stdc++.h>
using namespace std;
string s;
int t;
void solve(){
cin>>s>>t;
int n=s.size();
int a[n];
for(int i=0;i<n;i++){
a[i]=s[i]-'0';
}
int len=0;
vector<int> ve;
for(int i=1;i<n;i++){
if(a[i-1]>a[i]){
len++;
for(int j=i;j<n;j++){
a[j-1]=a[j];
}
if(len==t){
for(int i=0;i+t<n;i++){
ve.push_back(a[i]);
}
break;
}
i=1;
}
if(i==s.size()-1){
for(int i=0;i+t<n;i++){
ve.push_back(a[i]);
}
break;
}
}
int flag=1;
for(auto &x:ve){
if(x&&flag){
flag=0;
cout<<x;
}
else if(!flag){
cout<<x;
}
}
cout<<endl;
}
int main(){
solve();
}
7.青蛙的邻居
/*青蛙的邻居*/
//输入一个T,然后输入T组数据
//每组数据先输入一个n,在输入a1,a2,a3...an其中ai表示有多少个邻居
//判断每组数据是否存在相应的青蛙居住分布(可图性判定),存在输出Yes,反之输出No
/*样列输入:3 样列输出:
7
4 3 1 5 4 2 1 Yes
6
4 3 1 4 2 0 No
6
2 3 1 1 2 1 Yes */
#include<bits/stdc++.h>
using namespace std;
#define MAX 20
struct ALu{
int du;//顶点的度
int num;//序号
}a[MAX];
bool _sort(ALu x,ALu y){
return x.du>y.du;
}
int T,n,b[MAX][MAX],i,j,num2,k;
int main(){
cin>>T;
while(T--){
cin>>n;
for(i=0;i<n;i++){
cin>>a[i].du;
a[i].num=i;
}
int flag=1,len=0;
memset(b,0,sizeof(b));//对b数组初始化为0
while(len<n&&flag){//结束条件
sort(a+len,a+n,_sort);//从大到小排序
num2=a[len].du; //最大度数
i=a[len].num; //最大度数对应的序号
for(k=1;k<=num2&&flag;k++){
j=a[len+k].num;
if(a[len+k].du<=0) flag=0;//最大度数小于0就无法构出图
a[len+k].du--; //所有数-1操作
b[i][j]=b[j][i]=1;
}
len++;//删除第一个数进行下一步 4 4 3 2 1 0 ——3 2 0 -1
}
if(flag){
cout<<"Yes"<<endl;
// for(int i=0;i<n;i++){ //输出构造的图
// for(int j=0;j<n;j++){
// if(j) cout<<' ';
// cout<<b[i][j];
// }
// cout<<endl;
// }
}
else{
cout<<"No"<<endl;
}
}
return 0;
}
sort排序
/*sort排序*/
struct ALu{
char name[101];
int age;
double score;
}a[1001];
bool _sort(ALu x,ALu y){
if(abs(x.score-y.score)>0.000001) //小数点后六位
return x.score>y.score; //成绩大排前
return x.age>y.age; //年龄高排前
return strcmp(x.name,y.name)<0; //名字短排前
}