第一次见 div.3 d i v .3 非常激动,可惜星期天晚上我在学校不能打比赛.
故此我在vjudge上进行了一次vp.结果如下.
可以看到我手速还是不行,第1题时间没卡进1分钟,还吃了好几发罚时.
我的评价是:这场比赛的题目质量还是非常高的.
F题有一定的难度,我差一点就死了.
按照题意模拟.手测了第一发样例,结果时间没卡进去.
#include //Ithea Myse Valgulious
namespace chtholly{//此处快读快写略去39行,以下同
using namespace std;
int main(){
int n,k;
for (n=read(),k=read();k--;){
if (n%10) n--;
else n/=10;
}
write(n);
}
还是模拟并判断最大值.
#include //Ithea Myse Valgulious
namespace chtholly{
using namespace std;
map<string,int> mp;
int ans;string res;
int main(){
int n=read();
string a;cin>>a;
for (int i=0;i1;++i){
char c[9];
c[0]=a[i],c[1]=a[i+1];
mp[c]++;
if (mp[c]>ans) ans=mp[c],res=c;
}
cout<
将序列排序,注意有坑.
#include //Ithea Myse Valgulious
namespace chtholly{
using namespace std;
const int yuzu=2e5;
int n=read(),k=read(),a[yuzu|10];
int main(){
re0 i;
/*
刚好需要k个数小于或者等于x.
如果a[k]和a[k+1]相等就没有答案,反之必然有.
然后注意a[0]=1,因为答案必然在[1,1e9]之间.
这里特判了k=0的情况.
*/
for (i=1;i<=n;++i) a[i]=read();
sort(a+1,a+n+1);
if (!k) return write(a[1]==1?-1:1),0;
if (a[k]==a[k+1]) puts("-1");
else write(a[k]);
}
一开始我愁眉苦脸,后来发现可以搜索.
#include //Ithea Myse Valgulious
namespace chtholly{
using namespace std;
int n=read(),vis[105];
ll a[105],ans[105];
void dfs(int k){
if (k>n){
for (re0 i=1;i<=n;++i) write(ans[i]),p32;
exit(0);
}
/*如果可以接就把后面的数接上去.反正一共100个数字.*/
for (re0 i=1;i<=n;++i) if (k==1||!vis[i]&&(a[i]==ans[k-1]*2||a[i]*3==ans[k-1])){
ans[k]=a[i];
vis[i]=1;
dfs(k+1);
vis[i]=0;
}
}
int main(){
re0 i,j,k;
for (i=1;i<=n;++i) read(a[i]);
dfs(1);
}
求无向图环数.这题目有毒.
做法就是考虑环上所有点度数都是2,然后爆搜.
这个代码WA第18个点.
#include //Ithea Myse Valgulious
namespace chtholly{
using namespace std;
const int yuzu=2e5;
typedef int fuko[yuzu|10];
vector<int> lj[yuzu|10];
int n=read(),m=read(),ans,cnt;
fuko vis,du;
int dfs(int u){
if (du[u]^2) return 0;
vis[u]=1;
for (int i:lj[u]) if (!vis[i]){
return dfs(i);
}return 1;
}
int main(){
re0 i;
for (i=1;i<=m;++i){
int u=read(),v=read();
lj[u].push_back(v);
lj[v].push_back(u);
du[u]++,du[v]++;
}
for (i=1;i<=n;++i) if (!vis[i]){
ans+=dfs(i);
}write(ans);
}
这个代码AC.
#include //Ithea Myse Valgulious
namespace chtholly{
using namespace std;
const int yuzu=2e5;
typedef int fuko[yuzu|10];
vector<int> lj[yuzu|10];
int n=read(),m=read(),ans,cnt;
fuko vis,du;
int dfs(int u){
vis[u]=1;
if (du[u]^2) cnt=0;
for (int i:lj[u]) if (!vis[i]){
dfs(i);
}
}
int main(){
re0 i;
for (i=1;i<=m;++i){
int u=read(),v=read();
lj[u].push_back(v);
lj[v].push_back(u);
du[u]++,du[v]++;
}
for (i=1;i<=n;++i) if (!vis[i]){
cnt=1;
dfs(i);
ans+=cnt;
}write(ans);
}
我就不懂了,区别在哪里?
求最长连续上升子序列,并输出其中一组解.
首先观察Codeforces 605A Sorting Railway Cars的题解.
然后我们知道怎么去求最长连续上升子序列的长度.
605a中给定的序列一定是一个排列,但是本题中的数据范围是 109 10 9 .
那就上map.
#include //Ithea Myse Valgulious
namespace chtholly{
using namespace std;
const int yuzu=2e5;
typedef int fuko[yuzu|10];
fuko a,c,pre;int n=read(),len,p;
map<int,int> pos,f,vis;
int main(){
re0 i;
memset(pre,-1,sizeof pre);//不要忘了memset为-1.
for (i=1;i<=n;++i){
a[i]=read();
pos[a[i]]=i;//记录a[i]本次出现的位置.
if (vis[a[i]-1]){
f[pos[a[i]]]=f[pos[a[i]-1]]+1;//贪心选择离这里最近的一个a[i]-1出现的位置.显然这样答案不会更劣.
pre[i]=pos[a[i]-1];//记录一个pre.
}
vis[a[i]]=1;
}
for (i=1;i<=n;++i){
if (f[i]>len){
len=f[i],p=i;
}
}
int ans=0;
if (!p){
/*
注意特判p=0,此时答案为1随意输出一个即可.
Styx大佬糊出正解然后装逼输出rand()%(n-1)+1,结果给了一个数据n=1.
*/
printf("%d\n%d",1,1);
return 0;
}
write(len+1),pl;
for (;~p;p=pre[p]) c[++ans]=p;
for (i=ans;i;--i) write(c[i]),p32;
/*漂亮的递归返回.*/
}