組隊賽第一場(xiao)第七週
阿新 • • 發佈:2018-12-23
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 個雞蛋。那麼在最壞情況下我們最少需要做多少次實驗呢?
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
題意: 給你一個長度為 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;
}