1.题目描述:
给出许多个数,然后排序。偶数优先级最高,同奇偶性的话,数字大的优先级高。再给出一个n,输出排序后的前n项
输入描述:
输入很恶心,前面的数都用逗号分隔,后面的n用分号分隔。
输出描述:
输出排序之后的前n个数
样例1:
输入:
1,2,3,4,5;3
输出:
4,2,5
数据规模:
保证n小于等于数字量。能一行输入的东西,肯定不大。就是再大,O(nlog)也能跑完,再解不了的话不用写了。
思路:
C++莫得split函数,只好手写。AC 100%
代码:
#include <cstdio>
#include <string>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
string input;
vector<int> splitNum(string input)
{
vector<int> res;
int cnt = 0;
res.push_back(0);
for(int i=0;i<input.size();i++)
{
if('0'<=input[i] && input[i]<='9')
{
res[cnt] = res[cnt]*10 + input[i]-'0';
}
else
{
res.push_back(0);
cnt++;
}
}
return res;
}
bool cmp(int a,int b)
{
if(a%2==0 && b%2==0)
return a>b;
if(a%2==1 && b%2==1)
return a>b;
if(a%2==0 && b%2==1)
return 1;
if(a%2==1 && b%2==0)
return 0;
}
int main()
{
vector<int> Num;
int cnt,n;
cin>>input;
Num = splitNum(input);
cnt = Num.size()-1;
n = Num.at( Num.size()-1 );
sort(Num.begin(),Num.end()-1,cmp);
for(int i=0;i<n;i++)
{
cout<<Num[i];
if(i<n-1)printf(",");
}cout<<endl;
return 0;
}
2.题目描述:
输入描述:
输出描述:
样例1:
输入:
3
123
3
321
123
45
67
输出:
{
d d l
d d r
}
{
l l l
r l l
}
{
}
数据规模:
思路:
AC 100%
代码:
#include <string>
#include <cstring>
#include <cstdio>
#include <vector>
#include <map>
#include <iostream>
#include <algorithm>
using namespace std;
int N;
string s1,s2,st;
vector<char> res;
int dfs(int round,int i)
{/*printf("N=%d round=%d\n",N,round);
cout<<st<<endl;*/
if(round >= N)
{
if(st==s2)
{
for(int i=0;i<res.size();i++)
printf("%c ",res[i]);
printf("\n");
return 1;
}
return 0;
}
res.push_back('d');
dfs(round+1,i+1);
res.pop_back();
res.push_back('l');
st.insert(st.begin(),s1[i]);
dfs(round+1,i+1);
st.erase(st.begin());
res.pop_back();
res.push_back('r');
st += s1[i];
dfs(round+1,i+1);
st.erase(st.end()-1);
res.pop_back();
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
cin>>s1>>s2;
N = s1.size();
printf("{\n");
map<char,int> MP;
for(int i=0;i<s1.size();i++)
MP[s1[i]]++;
for(int i=0;i<s2.size();i++)
{
if(MP[s2[i]] == 0){goto loop1;}
MP[s2[i]]--;
}
dfs(0,0);
loop1:;
printf("}\n");
}
return 0;
}
3.题目描述:
概率论,n个骰子每个面数都不一定,给出n个数,x[i]代表第i个骰子有x[i]个面,第i个骰子掷出某个面的概率为1/x[i]。
一波掷n个骰子,最大的数作为结果,求期望。
输入描述:
输出描述:
样例1:
输入:
2
2 2
输出:
1.75
数据规模:
思路:
概率论,那哪会啊。听说是用个概率dp来解
代码:
4.题目描述:
在一块长为n,宽为m的场地上,有 n * m 个 1 * 1 的单元格,每个单元格上的数字就是按照从1到n和1到m中的数的乘积。具体如下
n = 3,m = 3
1 2 3
2 4 6
3 6 9
给出一个查询的值k,求出按照这个方式列举的的数中第k大的值V。
例如上面的例子里,
从大到小为(9,6,6,4,3,3,2,2,1)
k = 1,V = 9
k = 2,V = 6
k = 3,V = 6
…
k = 9,V = 1
输入描述:
只有一行是3个数n, m, k 表示场地的宽高和需要查询的k。
使用空格隔开。
输出描述:
给出第k大的数的值。
样例1:
输入:
3 3 4
输出:
4
数据规模:
100%的数据
1 <= n, m <= 40000
1 <= k <= n*m
30%的数据
1 <= n, m <= 1000
思路:
我没解出来。只暴力了30%
代码:
#include <cstdio>
#include <string>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
using namespace std;
int main()
{
int n,m,k;
map<int,int> MP;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
MP[i*j]++;
}
}
for(map<int,int>::reverse_iterator it=MP.rbegin();it!=MP.rend();it++)
{
if(k>it->second)
k -= it->second;
else
{
printf("%d\n",it->first);
break;
}
cout<< it->first <<" "<< it->second <<endl;
}
return 0;
}