哔哩哔哩
1.
给定一个数组,这些数连在一起可以组成一个大数,求能组成最大数。
如 [3, 30, 34, 5, 9] 能组成的最大数为 9534330。
由于组成的数可能非常大,用字符串返回。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<climits>
#include<vector>
#include<queue>
#include<algorithm>
#include<stack>
#include<sstream>
using namespace std;
bool cmpstr(string a, string b){
if( a+b>b+a)
return true;
else
return false;
}
string largestNumber(vector<int>& nums) {
vector<string> t;
string res = "";
for(int i = 0 ; i < nums.size(); i ++)
t.push_back(std::to_string(nums[i]));
for(int i = 0 ; i < t.size()-1; i ++)
{
for(int j = i+1 ; j < t.size() ; j++)
{
if(!cmpstr(t[i],t[j]))
swap(t[i],t[j]);
}
}
for(int i = 0 ; i < nums.size(); i++)
res+= t[i];
int p = 0;
while(res[p] == '0')
p++;
if(p == res.length())
return "0";
else
return res.substr(p);
}
vector<int> ToIntegerVector(string input) {
vector<int> output;
stringstream ss;
ss.str(input);
string item;
char delim = ',';
while (getline(ss, item, delim)) {
output.push_back(std::stoi(item));
}
return output;
}
int main(){
string ss;
cin>> ss;
vector<int> input = ToIntegerVector(ss);
string str = largestNumber(input);
cout<<str<<endl;
return 0;
}
from functools import cmp_to_key
aa = list(map(str, input().strip().split(',')))
def cmp1(a,b):
if a+b>b+a:
return 1
if a+b<b+a:
return -1
else:
return 0
return cmp(a+b,b+a)
aa.sort(key=cmp_to_key(cmp1),reverse=True)
print(''.join(aa))
2.
给出一个数组nums和一个正整数s,求nums的子数组中和大于s的长度最小的子数组的长度。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<vector>
#include<queue>
#include<algorithm>
#include<stack>
#include<sstream>
using namespace std;
int minSubArrayLen(int s, vector<int>& nums) {
int ans = INT_MAX;
int i = 0;
int sum = 0;
int begin = 0;
while(i < nums.size())
{
if(sum + nums[i] < s)
{
sum += nums[i];
++ i;
}
else
{
if(i - begin < ans)
ans = i - begin + 1;
sum = sum - nums[begin];
++ begin;
}
}
return ans == INT_MAX? -1:ans;
}
int main(){
int n,s;
scanf("%d %d",&n,&s);
vector<int> input;
int t;
for(int i=0;i<n;i++){
scanf("%d",&t);
input.push_back(t);
}
int ans=minSubArrayLen(s,input);
cout<<ans<<endl;
return 0;
}
3.
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<climits>
#include<vector>
#include<queue>
#include<algorithm>
#include<stack>
#include<sstream>
using namespace std;
int p[100001];
int res[100001];
int ans1=0,ans2=0;
void find(int x,int d){
res[x]=res[x]+d+1;
if(p[x]==x){
if(res[x]>ans1){
ans1=res[x];
ans2=x;
}
return;
}
else{
find(p[x],d);
return;
}
}
int main(){
int n;
scanf("%d",&n);
int t1,t2;
memset(res,0,sizeof(res));
for(int i=0;i<100001;i++){
p[i]=i;
}
for(int i=0;i<n;i++){
scanf("%d %d",&t1,&t2);
p[t2]=t1;
find(t1,res[t2]);
//cout<<res[t1]<<endl;
}
cout<<ans2<<endl;
//system("PAUSE");
return 0;
}