A:
题意:
给n个点的坐标与对应速度,求从原点到任意一点的最短时间
题解:
模拟
B:
题意:
某一饮料在第i个店的贩卖价格为x[i],现在给出q个硬币求最多可以选择在几家店买该饮料。
题解:
将价格快排,再二分搜索即可
#include<iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include<stdlib.h>
#include <string.h>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<time.h>
using namespace std;
#define MAX_N 100005
#define inf 0x7fffffff
#define LL long long
#define ull unsigned long long
#define mod 10007
LL INF=9e18;
int a[MAX_N];
bool cmp(int a,int b)
{
return a<b;
}
int main()
{
int n;
cin >> n;
for(int i=0;i<n;i++) {
cin >> a[i];
}
sort(a,a+n,cmp);
int q;
cin >> q;
for(int i=0;i<q;i++) {
int tmp;
cin >> tmp;
printf("%d\n",upper_bound(a,a+n,tmp) - a);
}
}
C:
题意:
给出n个字符串,每个字符串可以花费c[i]进行翻转,问如何花费最少使这n个字符串按字典序升序排序
题解:
设do[i][0]为第i个字符串不翻转形成升序串的最小花费 dp[i][1]为第i个字符串翻转形成升序串的最小花费,用string保存字符串更好处理
#include<iostream>
#include <stdio.h>
#include <algorithm>
#include <math.h>
#include<stdlib.h>
#include <string.h>
#include<queue>
#include<set>
#include<map>
#include<stack>
#include<time.h>
using namespace std;
#define MAX_N 100005
#define inf 0x7fffffff
#define LL long long
#define ull unsigned long long
#define mod 10007
LL INF=9e18;
//dp[i][2] dp[i][0]第i个字符串不翻转的花费,dp[i][1]第i个字符串翻转的花费
LL c[MAX_N];
LL dp[MAX_N][2];
string s[MAX_N], rs[MAX_N];
int n;
int main()
{
cin >> n;
for(int i=0;i<n;i++)
cin >> c[i];
for(int i=0;i<n;i++) {
cin >> rs[i];
s[i] = rs[i];
reverse(rs[i].begin(), rs[i].end());
}
for(int i=1;i<n;i++) {
dp[i][0] = dp[i][1] = -1;
}
dp[0][0] = 0;
dp[0][1] = c[0];
for(int i=1;i<n;i++) {
if(s[i] >= s[i-1] && dp[i-1][0] != -1)
dp[i][0] = dp[i-1][0];
if(s[i] >= rs[i-1] && dp[i-1][1] != -1)
dp[i][0] = dp[i][0] == -1 ? dp[i-1][1] : min(dp[i][0], dp[i-1][1]);
if(rs[i] >= s[i-1] && dp[i-1][0] != -1)
dp[i][1] = dp[i-1][0] + c[i];
if(rs[i] >= rs[i-1] && dp[i-1][1] != -1)
dp[i][1] = dp[i][1] == -1 ? dp[i-1][1] + c[i] : min(dp[i][1], dp[i-1][1] + c[i]);
}
LL ans;
if(dp[n-1][0] == -1 && dp[n-1][1] == -1)
ans = -1;
else if(dp[n-1][0] == -1)
ans = dp[n-1][1];
else if(dp[n-1][1] == -1)
ans = dp[n-1][0];
else
ans = min(dp[n-1][0], dp[n-1][1]);
cout << ans << endl;
}