A. Minimizing the String
time limit per test

1 second

memory limit per test

256 megabytes

Description:

You are given a string ss consisting of nn lowercase Latin letters.

You have to remove at most one (i.e. zero or one) character of this string in such a way that the string you obtain will be lexicographically smallest among all strings that can be obtained using this operation.

String s=s1s2…sns=s1s2…sn is lexicographically smaller than string t=t1t2…tmt=t1t2…tm if n<mn<m and s1=t1,s2=t2,…,sn=tns1=t1,s2=t2,…,sn=tn or there exists a number pp such that p≤min(n,m)p≤min(n,m) and s1=t1,s2=t2,…,sp−1=tp−1s1=t1,s2=t2,…,sp−1=tp−1 and sp<tpsp<tp .

For example, "aaa" is smaller than "aaaa", "abb" is smaller than "abc", "pqr" is smaller than "z".

Input

The first line of the input contains one integer nn (2≤n≤2⋅1052≤n≤2⋅105 ) — the length of ss .

The second line of the input contains exactly nn lowercase Latin letters — the string ss .

Output

Print one string — the smallest possible lexicographically string that can be obtained by removing at most one character from the string ss .

Examples
Input
3 aaa
 
Output
aa
 
Input

5
abcda
 
Output
abca
 
Note

In the first example you can remove any character of ss to obtain the string "aa".

In the second example "abca" < "abcd" < "abcda" < "abda" < "acda" < "bcda".

题意:

在序列中至多删去一个数,使得操作后得序列最小(与执行相同操作的其它序列相比)

题解:

通过模拟一下这个过程可以发现我们要找 i 这个位置,满足si>si+1&&i<n 或者直接i=n。

代码如下:

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std; const int N = 2e5+;
char s[N];
int n; int main(){
scanf("%d",&n);getchar();
for(int i=;i<=n;i++) scanf("%c",&s[i]);
int i,pos=n;
for(i=;i<n;i++){
int j=i+;
if(s[j]<s[i]){
pos=i;
break ;
}
}
for(int i=;i<=n;i++){
if(i==pos) continue ;
printf("%c",s[i]);
}
return ;
}
B. Divisor Subtraction
time limit per test

2 seconds

memory limit per test

256 megabytes

Description:

You are given an integer number nn. The following algorithm is applied to it:

  1. if n=0, then end algorithm;
  2. find the smallest prime divisor d of n;
  3. subtract d from n and go to step 1.

Determine the number of subtrations the algorithm will make.

Input

The only line contains a single integer nn (2≤n≤10102≤n≤1010).

Output

Print a single integer — the number of subtractions the algorithm will make.

Examples
Input
5
Output
1
 
Input
4
Output
2
 
Note

In the first example 5 is the smallest prime divisor, thus it gets subtracted right away to make a 0.

In the second example 2 is the smallest prime divisor at both steps.

题意:

找n最小的质因子d,然后减去d,不断 重复这一过程直到n=0。

题解:

n为偶数很容易。当n为奇数时,质因子必为奇数,减去后也为偶数。所以问题的关键就是当n为奇数的情况。

最后发现只要找到一个最小的d,使得n%d==0就可以了,不管d是否为质数。

我当时没考虑到这一点,所以代码有点丑陋。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std; long long n; inline int prim(int x){
int flag = ;
for(int i=;i<=sqrt(x+0.5)+;i++){
if(x%i==){
flag=;break ;
}
}
return flag;
} int main(){
scanf("%lld",&n);
if(n%==){
printf("%lld",n/);return ;
}
if(prim(n)){
printf("");return ;
}
for(int i=;i<=sqrt(n+0.5)+;i++){
if(n%i== && prim(i)){
printf("%lld",+(n-i)/);
return ;
}
}
return ;
}
C. Meme Problem
time limit per test

1 second

memory limit per test

256 megabytes

Try guessing the statement from this picture:

You are given a non-negative integer dd . You have to find two non-negative real numbers aa and bb such that a+b=d and a⋅b=d .

Input

The first line contains tt (1≤t≤1031≤t≤103 ) — the number of test cases.

Each test case contains one integer d (0≤d≤103) .

Output

For each test print one line.

If there is an answer for the i -th test, print "Y", and then the numbers a and b .

If there is no answer for the i -th test, print "N".

Your answer will be considered correct if |(a+b)−a⋅b|≤10−6|(a+b)−a⋅b|≤10−6 and |(a+b)−d|≤10−6|(a+b)−d|≤10−6 .

 
Example
Input
7
69
0
1
4
5
999
1000
Output
Y 67.985071301 1.014928699
Y 0.000000000 0.000000000
N
Y 2.000000000 2.000000000
Y 3.618033989 1.381966011
Y 997.998996990 1.001003010
Y 998.998997995 1.00100200
题意:
给出一个数d,找两个数x,y,满足x+y=d 并且x*y=d。
 
题解:
我用的是二分,当时好像证明了二分的正确性。但实际上有更简单的数学方法,就是利用x+y=d,x*y=d这两个等式(韦达定理),变换一下可以解一个方程。
 
我还是给出我的二分代码吧。。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <cmath>
using namespace std; int t,n;
double eps = 1e-; int main(){
scanf("%d",&t);
while(t--){
scanf("%d",&n);
if(n==){
printf("Y 0.000000000 0.000000000\n");
continue ;
}else if(n== || n== ||n==){
printf("N\n");continue;
}else if(n==){
printf("Y 2.000000000 2.000000000\n");
continue ;
}else{
double l = ,r=,mid,Ans,tmp;
while(l<=r){
mid=(l+r)/;
tmp = n-mid;
if(abs(tmp*mid-tmp-mid)<eps || abs(tmp*mid-n)<eps){
Ans=mid;break;
}
if(tmp*mid-tmp-mid<) l=mid+0.0000000001;
else r=mid-0.0000000001;
}
printf("Y %.9lf %.9lf\n",n-Ans,Ans);
}
} return ;
}
D. Edge Deletion
time limit per test

2.5 seconds

memory limit per test

256 megabytes

Description:

You are given an undirected connected weighted graph consisting of nn vertices and mm edges. Let's denote the length of the shortest path from vertex 11 to vertex ii as didi .

You have to erase some edges of the graph so that at most kk edges remain. Let's call a vertex ii good if there still exists a path from 11 to ii with length didi after erasing the edges.

Your goal is to erase the edges in such a way that the number of good vertices is maximized.

Input

The first line contains three integers nn , mm and kk (2≤n≤3⋅1052≤n≤3⋅105 , 1≤m≤3⋅1051≤m≤3⋅105 , n−1≤mn−1≤m , 0≤k≤m0≤k≤m ) — the number of vertices and edges in the graph, and the maximum number of edges that can be retained in the graph, respectively.

Then mm lines follow, each containing three integers xx , yy , ww (1≤x,y≤n1≤x,y≤n , x≠yx≠y , 1≤w≤1091≤w≤109 ), denoting an edge connecting vertices xx and yy and having weight ww .

The given graph is connected (any vertex can be reached from any other vertex) and simple (there are no self-loops, and for each unordered pair of vertices there exists at most one edge connecting these vertices).

Output

In the first line print ee — the number of edges that should remain in the graph (0≤e≤k0≤e≤k ).

In the second line print ee distinct integers from 11 to mm — the indices of edges that should remain in the graph. Edges are numbered in the same order they are given in the input. The number of good vertices should be as large as possible.

Examples
Input

3 3 2
1 2 1
3 2 1
1 3 3
Output
2
1 2
 
Input

4 5 2
4 1 8
2 4 1
2 1 3
3 4 9
3 1 5
Output
2
3 2
 
题意:
这个复制粘贴过来好像有点问题...将就看吧。
题目的要求就是可以留下最多k条边,使得最后的图中所有的点的最小距离都跟未删边一样。
 
题解:
题解还是好像,但是代码实现起来坑了我好久...
这题spfa会被卡,所以用了dijsktra。
我们可以发现,最短的最短路径树就是答案,然后记录结果的时候就当点从优先队列里面取出来的时候记录就可以了,因为Dijsktra中,点取出来的时候就是当前最小距离。
 
代码如下:
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#include <vector>
#define INF 1e18
using namespace std; typedef long long LL;
typedef pair<LL,int> pli;
typedef pair<int,int> pii; const int N = 3e5+;
int n,m,k;
int vis[N]={};
LL d[N];
pli pre[N];
vector<pair<int,pii> > vec[N];
vector<int> ans ;
void Dij(int x){
fill(d,d+n+,INF);d[x]=0ll;
priority_queue<pli,vector<pli>,greater<pli> > q;
q.push(make_pair(d[x],x));
while(!q.empty()){
pli now = q.top();q.pop();
int u = now.second;
if(vis[u]) continue ;
vis[u]=;
for(int i=;i<vec[u].size();i++){
int v = vec[u][i].second.first;
if(d[v]>d[u]+vec[u][i].second.second &&!vis[v]){
d[v]=d[u]+vec[u][i].second.second;
pre[v]=make_pair(u,vec[u][i].first);
q.push(make_pair(d[v],v));
}
}
}
}
queue <int> que ;
void bfs(int x,int K){
que.push(x);
while(!que.empty() && K){
int u = que.front();que.pop();
for(int i=;i<vec[u].size();i++){
int v = vec[u][i].second.first ;
if(d[v]==d[u]+vec[u][i].second.second){
que.push(v);
ans.push_back(vec[u][i].first);
K--;
}
if(!K) break ;
}
}
}
int main(){
scanf("%d%d%d",&n,&m,&k);
for(int i=,u,v,c;i<=m;i++){
scanf("%d%d%d",&u,&v,&c);
vec[u].push_back(make_pair(i,make_pair(v,c)));
vec[v].push_back(make_pair(i,make_pair(u,c)));
}
Dij();
bfs(,k);
printf("%d\n",ans.size());
for(int i=;i<ans.size();i++) printf("%d ",ans[i]);
return ;
}
 

Educational Codeforces Round 54 (Rated for Div. 2) ABCD的更多相关文章

  1. Educational Codeforces Round 54 (Rated for Div. 2) D:Edge Deletion

    题目链接:http://codeforces.com/contest/1076/problem/D 题意:给一个n个点,m条边的无向图.要求保留最多k条边,使得其他点到1点的最短路剩余最多. 思路:当 ...

  2. Educational Codeforces Round 54 [Rated for Div. 2] (CF1076)

    第一次在宿舍打CF 把同宿舍的妹子吵得不行... 特此抱歉QAQ A 题意:给定一个字符串, 最多删掉一个字符,使得剩余字符串字典序最小 n<=2e5 当然"最多"是假的 删 ...

  3. Educational Codeforces Round 54 (Rated for Div. 2) Solution

    A - Minimizing the String solved 题意:给出一个字符串,可以移掉最多一个字符,在所有可能性中选取一个字典序最小的. 思路:显然,一定可以移掉一个字符,如果移掉的字符的后 ...

  4. Educational Codeforces Round 54 (Rated for Div. 2) DE

    D 给出一个无向图,需要删去一些边,想知道最后能有多少个点到1的距离还是过去那么短 如果求一个最短路,然后从删边的角度看,看起来很难做,但是如果从零开始加边就会有做法,如同prim那样,先加入和1直接 ...

  5. Educational Codeforces Round 54 (Rated for Div. 2) D Edge Deletion (SPFA + bfs)

    题目大意:给定你一个包含n个点m条边的无向图,现在最多在图中保留k条边,问怎么删除多的边,使得图中良好的节点数最多,求出保留在图中的边的数量和编号. 良好的节点定义为:删除某条边后该点到点1的最短距离 ...

  6. Educational Codeforces Round 56 (Rated for Div. 2) ABCD

    题目链接:https://codeforces.com/contest/1093 A. Dice Rolling 题意: 有一个号数为2-7的骰子,现在有一个人他想扔到几就能扔到几,现在问需要扔多少次 ...

  7. Educational Codeforces Round 72 (Rated for Div. 2)-D. Coloring Edges-拓扑排序

    Educational Codeforces Round 72 (Rated for Div. 2)-D. Coloring Edges-拓扑排序 [Problem Description] ​ 给你 ...

  8. Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - C. Magic Ship Time Limit: 2000 mSec P ...

  9. Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems(动态规划+矩阵快速幂)

    Problem   Educational Codeforces Round 60 (Rated for Div. 2) - D. Magic Gems Time Limit: 3000 mSec P ...

随机推荐

  1. python生成器详解

    1. 生成器 利用迭代器(迭代器详解python迭代器详解),我们可以在每次迭代获取数据(通过next()方法)时按照特定的规律进行生成.但是我们在实现一个迭代器时,关于当前迭代到的状态需要我们自己记 ...

  2. HTTP学习之HTTP基础

    学习HTTP技术,首先要了解它的在web通信中有哪些特点,起到什么作用.有哪些规范.都有什么功能. HTTP的特点 HTTP使用的是一种可靠的.快速响应的数据传输协议,用户一旦发起请求,Web服务器可 ...

  3. Date()日期函数浏览器兼容问题踩坑

    原文:Date()日期函数浏览器兼容问题踩坑 之前用layui做的一项目中,table中用到了日期格式化的问题.直接没多想,撸代码就完了呗,结果最近一段时间客户反馈说显示日期跟录入日期不一样(显示日期 ...

  4. itop-4412开发板学习-内核信号量

    1. 翻翻书看下,linux提供两种信号量,内核信号量,由内核控制路径使用,System V IPC信号量,由用户态进程使用.下面的就是内核部分的信号量.内核信号量类似于自旋锁,当锁关闭着时,不允许内 ...

  5. Unity5.6偶尔不能创建项目解决办法

    Unity5.6偶尔启动后,不能创建项目,解决办法如下: 1.打开Unity 2.在开始窗口退出当前登录的账户 3.重新登录 4.然后就可以创建新项目了 5.如果以上方法不生效,关闭Unity再重试一 ...

  6. 小程序如何去掉button组件的边框

    小程序获取用户授权不再支持wx.getUserInfo方法,改为用button获取,格式如下 <button class="btn btn" open-type=" ...

  7. iOS URL加解密

    URL加解密 背景介绍 iOS 下URL加解密,项目使用AFNetworking 虽然是使用HTTPS,但是从安全方面考虑,在很多情况下还是需要对url的参数进行加密的. 接口如 https://19 ...

  8. 数据库sql命令

    本文为转载,原文地址:http://www.cnblogs.com/cangqiongbingchen/p/4530333.html 1.说明:创建数据库CREATE DATABASE databas ...

  9. NLP系列-中文分词(基于词典)

    中文分词概述 词是最小的能够独立活动的有意义的语言成分,一般分词是自然语言处理的第一项核心技术.英文中每个句子都将词用空格或标点符号分隔开来,而在中文中很难对词的边界进行界定,难以将词划分出来.在汉语 ...

  10. Python 3 学习笔记之——面向对象

    1. 类的介绍 类(Class) 用来描述具有相同的属性和方法的对象的集合.它定义了该集合中每个对象所共有的属性和方法.对象是类的实例,类是对象的抽象. 方法:类中定义的函数. 类变量:类变量在整个实 ...