A
找第三大
Input
4
1 1 2 3 4 5 6 7 8 9 1000
2 338 304 619 95 343 496 489 116 98 127
3 931 240 986 894 826 640 965 833 136 138
4 940 955 364 188 133 254 501 122 768 408
Output
1 8
2 489
3 931
4 768
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
int main()
{
ll t,n,i,o;
ll a[101010]={0};
cin>>t;
while(t--)
{
cin>>o;
memset(a,0,sizeof(a));
for(i=0;i<10;i++)
cin>>a[i];
sort(a,a+10);
cout<<o<<" "<<a[7]<<endl;
}
return 0;
}
B
题意:分割找最小的和
思路:答案肯定是在最小值和和中间,直接遍历最小值和和符合条件就输出
Input
3
1 6
2 5 1 3 3 7
2 6
1 2 3 4 5 6
3 20
1 1 2 1 1 2 1 1 2 1
1 2 1 1 2 1 1 2 1 1
Ouput
1 7
2 21
3 2
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
int main()
{
ll t,n,i,o,j;
ll a[101010]={0};
cin>>t;
while(t--)
{
cin>>o>>n;
ll sum=0,minn=101010;
for(i=0;i<n;i++)
{
cin>>a[i];
sum+=a[i];
minn=(minn,a[i]);
}
ll s=0,num=0;
for(i=minn;i<=sum;i++)
{
num=0,s=0;
for(j=0;j<n;j++)
{
s+=a[j];
if(s==i)
{
num++;
s=0;
}
if(s>i)
{
s=0;
break;
}
}
if(num*i==sum)
break;
}
cout<<o<<" ";
if(i<sum)
cout<<i<<endl;
else
cout<<sum<<endl;
}
return 0;
}
D
题意:找前奇数位的中位数 注意格式
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
typedef long long ll;
using namespace std;
int main()
{
ll t,i,j,n,cc=0,flag,x;
ll a[101001],b[101001],c[101001];
cin>>t;
while(t--)
{
cin>>x>>n;
flag=(n+1)/2;
for(i=0; i<n; i++)
cin>>a[i];
ll l=0,cc=0;
ll y=1;
while(flag--)
{
l=0;
memset(b,0,sizeof(b));
for(i=0; i<y; i++)
b[l++]=a[i];
sort(b,b+l);
c[cc++]=b[l/2];
y+=2;
}
cout<<x<<" "<<(n+1)/2<<endl;
for(i=0;i<cc;i++)
{
if((i+1)%10==0)
cout<<" "<<c[i]<<endl;
else
if(i%10==0)
cout<<c[i];
else
cout<<" "<<c[i];
}
if(cc%10!=0)
cout<<endl;
}
}
E
题意:找比现在数大且最小的
思路:从后面遍历,只要遇到后面比这个数大的就停止,交换后后面的按顺序输出
Input
3
1 123
2 279134399742
3 987
OUT
1 132
2 279134423799
3 BIGGEST
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
int main()
{
ll t,n,i,o,j,len,k,kk;
char s[101010];
cin>>t;
while(t--)
{
memset(s,0,sizeof(s));
cin>>o>>s;
len=strlen(s);
for(i=len-2;i>=0;i--)
{
ll minn=10;
for(j=i+1;j<len;j++)
{
if(s[j]>s[i])
{
if(s[j]-'0'<minn)
{k=j;
minn=s[k]-'0';}
}
}
if(minn!=10)
{
char tt;
tt=s[k];
s[k]=s[i];
s[i]=tt;
kk=i;
break;
}
}
if(i<0)
cout<<o<<" "<<"BIGGEST"<<endl;
else
{
cout<<o<<" ";
for(i=0;i<=kk;i++)
cout<<s[i];
char ss[10000];
memset(ss,0,sizeof(ss));
ll l=0;
for(i=kk+1;i<len;i++)
ss[l++]=s[i];
sort(ss,ss+l);
for(i=0;i<l;i++)
cout<<ss[i];
cout<<endl;
}
}
return 0;
}
C 扔鸡蛋问题
输入
4
1 2 10
2 2 100
3 2 300
4 25 900
输出
1 4
2 14
3 24
4 10
题目大意:
有一些鸡蛋,我们现在想知道这些鸡蛋的硬度。然后现在有一座很高很高的大楼里,我们现在要在这座大楼上测试鸡蛋的硬度。每个鸡蛋的硬度相同,鸡蛋的硬度定义为:如果鸡蛋从第 m 层上掉下来没有破裂,而从第 m+1 层上掉下来就破裂了,那么这个鸡蛋的硬度就是 m 。某个鸡蛋如果在实验中破裂了就永远的损失了。我们现在有 n 个鸡蛋。那么在最坏情况下我们最少需要做多少次实验呢?
推荐一篇博客https://blog.csdn.net/joylnwang/article/details/6769160 为之叹服
AC代码
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
ll dp[1000][1000];//i是鸡蛋数,j是楼数
int main()
{
ll n,m,i,a,o,T,j,k;
cin>>T;
while(T--)
{
cin>>o>>n>>m;//n鸡蛋数 m楼层数
memset(dp,0,sizeof(dp));
for(i=1;i<=m;i++)
dp[1][i]=i;
for(i=1;i<=n;i++)
dp[i][1]=1;
for(i=2;i<=n;i++)//鸡蛋数
{
for(j=2;j<=m;j++)//楼层数
{
dp[i][j]=inf;
for(k=1;k<=j;k++)
dp[i][j]=min(dp[i][j],max(dp[i-1][k-1],dp[i][j-k])+1);//jia1是因为加上上一步分的 最后max()里面的可以举个例子理解一下 总共10层楼 取k是5,则是求dp[1][4]和dp[2][5]的最大值(最坏的情况)
}
}
cout<<o<<" "<
F
题目链接 http://acm.sdibt.edu.cn/vjudge/contest/view.action?cid=2099#problem/F
题意: 给你一个长度为 n 的 0/1 串,然后根据公式求答案为 k 的串的个数。
分析:对于长度为 i 的串,假设它的权值为 j,则长度为 i+1 的串的权值只可能为 j 或 j+1,且仅与末位元素和新添加元素有关。
令 dp[i][j][k] 表示长度为 i 的串、权值为 j 、末位为 k (0 or 1) 的方案种数。
状态转移方程为 dp[i][j][0] = dp[i-1][j][0] + dp[i-1][j][1] , dp[i][j][1] = dp[i-1][j][0] + dp[i-1][j-1][1]。
把长度为 n 的串 转化为长度为 n-1 的末尾为 0 或 1 的两种子问题。
input
10
1 5 2
2 20 8
3 30 17
4 40 24
5 50 37
6 60 52
7 70 59
8 80 73
9 90 84
10 100 90
ouput
1 6
2 63426
3 1861225
4 168212501
5 44874764
6 160916
7 22937308
8 99167
9 15476
10 23076518
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
using namespace std;
typedef long long ll;
#define inf 0x3f3f3f3f
ll dp[111][111][2];
int main()
{
ll n,m,i,a,o,T,j,k;
dp[1][0][1]=1;
dp[1][0][0]=1;
for(i=2;i<=110;i++)
{
dp[i][0][1]=dp[i-1][0][0];
dp[i][0][0]=dp[i-1][0][0]+dp[i-1][0][1];
for(j=1;j<=110;j++)
{
dp[i][j][0]=dp[i-1][j][0]+dp[i-1][j][1];
dp[i][j][1]=dp[i-1][j-1][1]+dp[i-1][j][0];
}
}
cin>>T;
while(T--)
{
cin>>o>>n>>m;
cout<<o<<" "<<dp[n][m][0]+dp[n][m][1]<<endl;
}
return 0;
}