水题直接代码。。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
void fre() { freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); }
#define ios ios::sync_with_stdio(false);
#define endl '\n'
#define PI acos(-1)
#define PB push_back
#define ll long long
#define db double
#define INF 0x3f3f3f3f
#define mod 998244353
#define lowbit(abcd) (abcd & (-abcd))
const int mxn = 2e5 + 10;
int ar[mxn];
int main()
{
/* fre(); */
int T;
scanf("%d", &T);
while(T --)
{
int n, d;
scanf("%d %d", &n, &d);
for(int i = 0; i < n; i ++)
scanf("%d", &ar[i]);
int ct = ar[0];
for(int i = 1; i < n && d > 0; i ++)
{
int t = (d / i);
int c = min(t, ar[i]);
ct += c;
d -= c * i;
}
printf("%d\n", ct);
}
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
void fre() { freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); }
#define ios ios::sync_with_stdio(false)
#define endl '\n'
#define PI acos(-1)
#define PB push_back
#define ll long long
#define db double
#define INF 0x3f3f3f3f
#define mod 998244353
#define lowbit(abcd) (abcd & (-abcd))
const int mxn = 2e5 + 10;
int ar[mxn];
int main()
{
/* fre(); */
int t;
scanf("%d", &t);
while(t --)
{
int n, s;
scanf("%d %d", &n, &s);
int mx= 0;
int ans = 0;
for(int i = 1; i <= n; i ++)
{
scanf("%d", &ar[i]);
mx = max(mx, ar[i]);
if(ar[i] == s)
ans = 1;
}
if(ans)
{
printf("%d\n", ans);
continue;
}
if(s % mx == 0)
{
ans = s / mx;
}
else
{
ans = s / mx + 1;
}
printf("%d\n", max(2, ans));
}
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
void fre() { freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); }
#define ios ios::sync_with_stdio(false);
#define endl '\n'
#define PI acos(-1)
#define PB push_back
#define ll long long
#define db double
#define INF 0x3f3f3f3f
#define mod 998244353
#define lowbit(abcd) (abcd & (-abcd))
const int mxn = 2e5 + 10;
int ar[mxn];
map<int,int> mp;
int main()
{
/* fre(); */
int T;
scanf("%d", &T);
while(T --)
{
mp.clear();
int n, d;
scanf("%d %d", &n, &d);
for(int i = 1; i <= n; i ++)
scanf("%d", &ar[i]), mp[ar[i]] ++;
int ans = INF;
for(int i = 1; i <= n; i ++)
{
int mx = ar[i];
int D = d;
int t = D / mx;
D -= t * mx;
if(D)
{
if(mp[D])
t += 1;
else
{
if(t >= 1)
t += 1;
else
t += 2;
}
}
/* printf("%d = %d %d\n", i, t, D); */
ans = min(ans, t);
}
printf("%d\n", ans);
}
return 0;
}
注意在我们说的“等差子序列”都是指的是在长度相同的情况下,某个相同子序列(并不是指的所有长度相同的子序列)
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
void fre() { freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); }
#define ios ios::sync_with_stdio(false)
#define endl '\n'
#define PI acos(-1)
#define PB push_back
#define ll long long
#define db double
#define INF 0x3f3f3f3f
#define mod 998244353
#define lowbit(abcd) (abcd & (-abcd))
const int mxn = 2e5 + 10;
ll dp1[mxn]; //统计单个字符出现的次数
ll dp2[30][30]; //统计仅有2个字符组成的子串的数量
int main()
{
ios;
/* fre(); */
string s;
cin >> s;
for(int i = 0; i < s.size(); i ++)
{
int ch = s[i] - 'a';
for(int j = 0; j < 26; j ++)
{
dp2[j][ch] += dp1[j];
}
dp1[ch] ++;
}
ll ans = 0;
for(int i = 0; i < 26; i ++) ans = max(ans, dp1[i]);
for(int i = 0; i < 26; i ++)
for(int j = 0; j < 26; j ++)
ans = max(ans, dp2[i][j]);
printf("%lld\n", ans);
return 0;
}
而我们要做的就是合理的建边,使最短路距离尽可能的减少,这样最短路距离就尽可能的大了
)?另外一种优化的枚举x、y过程的思路,传送门
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
void fre() { freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); }
#define ios ios::sync_with_stdio(false)
#define endl '\n'
#define PI acos(-1)
#define PB push_back
#define ll long long
#define db double
#define INF 0x3f3f3f3f
#define mod 998244353
#define lowbit(abcd) (abcd & (-abcd))
const int mxn = 2e5 + 10;
vector<int> V;
vector<int> edge[mxn];
int q[mxn * 10];
int dis1[mxn], dis2[mxn]; //dis1 表示从起点1到其他各点的最短路,dis2表示从n到其他的点的最短路
void bfs(int dis[], int s)
{
int qh = 0, qt = 0;
fill(dis, dis + mxn, INF);
q[++ qt] = s;
dis[s] = 0;
while(qt > qh)
{
s = q[++ qh];
for(auto x : edge[s])
{
if(dis[x] == INF)
{
dis[x] = dis[s] + 1;
q[++ qt] = x;
}
}
}
}
int main()
{
/* fre(); */
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
int p;
for(int i = 0; i < k; i ++)
scanf("%d", &p), V.push_back(p);
int u, v;
for(int i = 0; i < m; i ++)
{
scanf("%d %d", &u, &v);
edge[u].push_back(v);
edge[v].push_back(u);
}
bfs(dis1, 1);
bfs(dis2, n);
vector<pair<int, int> > vec;
for(auto x : V)
vec.push_back(make_pair( dis1[x], x ));
sort(vec.begin(), vec.end());
int ans = 0;
for(int i = 1; i < vec.size(); i ++)
{
int d = dis1[n];
int u = vec[i - 1].second, v = vec[i].second;
d = min(d, dis1[u] + dis2[v] + 1);
d = min(d, dis1[v] + dis2[u] + 1);
ans = max(ans, d);
}
printf("%d\n", ans);
return 0;
}
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
void fre() { freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); }
#define ios ios::sync_with_stdio(false)
#define endl '\n'
#define PI acos(-1)
#define PB push_back
#define ll long long
#define db double
#define INF 0x3f3f3f3f
#define mod 998244353
#define lowbit(abcd) (abcd & (-abcd))
const int mxn = 2e5 + 10;
vector<int> V;
vector<int> edge[mxn];
int q[mxn * 10];
int dis1[mxn], dis2[mxn]; //dis1 表示从起点1到其他各点的最短路,dis2表示从n到其他的点的最短路
void bfs(int dis[], int s)
{
int qh = 0, qt = 0;
fill(dis, dis + mxn, INF);
q[++ qt] = s;
dis[s] = 0;
while(qt > qh)
{
s = q[++ qh];
for(auto x : edge[s])
{
if(dis[x] == INF)
{
dis[x] = dis[s] + 1;
q[++ qt] = x;
}
}
}
}
int main()
{
/* fre(); */
int n, m, k;
scanf("%d %d %d", &n, &m, &k);
int p;
for(int i = 0; i < k; i ++)
scanf("%d", &p), V.push_back(p);
int u, v;
for(int i = 0; i < m; i ++)
{
scanf("%d %d", &u, &v);
edge[u].push_back(v);
edge[v].push_back(u);
}
bfs(dis1, 1);
bfs(dis2, n);
vector<pair<int, int> > vec;
for(auto x : V)
vec.push_back(make_pair( dis1[x] - dis2[x], x ));
sort(vec.begin(), vec.end());
int mx = -INF, bs = 0;
for(auto x : vec)
{
bs = max(bs, dis2[x.second] + mx);
mx = max(mx, dis1[x.second]);
}
printf("%d\n", min(dis1[n], bs + 1));
return 0;
}