NOIP 10.23模拟B层

来源:互联网 发布:图书馆管理系统 uc矩阵 编辑:程序博客网 时间:2024/06/03 12:42

问题 A: 东风谷早苗
时间限制: 1 Sec 内存限制: 128 MB
【问题描述】

在幻想乡,东风谷早苗是以高达控闻名的高中生宅巫女。某一天,早苗终于入手了最新款的钢达姆模型。作为最新的钢达姆,当然有了与以往不同的功能了,那就是它能够自动行走,厉害吧(好吧,我自重)。早苗的新模型可以按照输入的命令进行移动,命令包含’E’、’S’、’W’、’N’四种,分别对应四个不同的方向,依次为东、南、西、北。执行某个命令时,它会向着对应方向移动一个单位。作为新型机器人,自然不会只单单执行一个命令,它可以执行命令串。对于输入的命令串,每一秒它会按照命令行动一次。而执行完命令串最后一个命令后,会自动从头开始循环。在0时刻时早苗将钢达姆放置在了(0,0)的位置,并且输入了命令串。她想要知道T秒后钢达姆所在的位置坐标。

【输入】

第1行:一个字符串,表示早苗输入的命令串,保证至少有1个命令。第2行:一个正整数T。

【输出】

第1行:两个整数,表示T秒时,钢达姆的坐标。

【输入输出样例】

robot.in
robot.out

NSWWNSNEEWN

12

-1 3

【数据范围】

对于60%的数据:T <= 500,000且命令串长度 <= 5,000;对于100%的数据:T <= 2,000,000,000且命令串长度<= 5,000。

【注意】

向东移动,坐标改变改变为(X+1,Y);向南移动,坐标改变改变为(X,Y-1);向西移动,坐标改变改变为(X-1,Y);

向北移动,坐标改变改变为(X,Y+1)。

输入
输出
提示

模拟(ps:这种水题不多写点真的容易挂)

#include <cstdio>#include <algorithm>#include <cstring>#include <iostream>#define int long longusing namespace std;string s;int t;int x,y;main(){    cin>>s;    int len=s.size();    scanf("%lld",&t);    int now=0;    x=0;    y=0;    for(int now=0;now<len;now++){        if(s[now]=='N')y++;       if(s[now]=='S') y--;       if(s[now]=='E') x++;       if(s[now]=='W') x--;     }     x=(t/len)*x;     y=(t/len)*y;     int yu=t%len;     for(int i=1;i<=yu;i++){       if(s[now]=='N') y++;       if(s[now]=='S') y--;       if(s[now]=='E') x++;       if(s[now]=='W') x--;       now++;     }     cout<<x<<" "<<y;    return 0;}

【问题描述】

小Y去Lhc Market购物,不过这个Market有个不成文的规定,就是买东西不找零。比如说,《算法导论》要68元,你付了100元,他会收下,但不会找你32元,于是你就用100元买了68元的东西,亏大了。小Y身边只有n张纸币,每张纸币有一个正整数面额p,Market里有k种商品,每种商品都有一个正整数单价t。小Y现在想知道,用他的纸币能恰好凑出哪些商品的价格。例如:5 1 4 8 9能凑出17=8+9, 6=1+5, 10=1+9等,但不能凑出2,3等。

【输入格式】

第1行:一个整数n(1 <= n <= 34),表示小Y有n张纸币。

第2至n+1行:每行一个正整数p(1 <= p <= 20000000),表示每张纸币的面额。

第n+2行:一个整数k(1 <= k <= 10),表示有k种商品。

第n+3至n+k+2行:每行一个正整数t(1 <= t <= 2000000000),表示每种商品的价格。

【输出格式】

共k行,第i行输出第i种商品的钱是否能凑出。如果能,输出“possible”,否则输出“impossible”(引号不输出,区分大小写)。

【样例输入】

3

2

7

9

2

11

4

【样例输出】

possible

impossible

【约定】

20%的数据 n <= 20;

20%的数据 p <= 100。

输入
输出
提示
MEET IN THE MIDDLE
一会再改,先存代码

#pragma G++ optimize (2)#pragma GCC optimize (2)#include<bits/stdc++.h>#define ll long long#define mod 199721using namespace std;inline int read(){    int x=0,f=1;    char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}ll d1[200050],a[50];int tot1=0,n;void dfs1(int step,ll sum){    if(step==n/2+1)    {        d1[++tot1]=sum;        return;    }    dfs1(step+1,sum);    dfs1(step+1,sum+a[step]);}map<ll,int>mp;void dfs2(int step,ll sum){    if(step==n+1)    {        mp[sum]=1;        return;    }    dfs2(step+1,sum);    dfs2(step+1,sum+a[step]);}int main(){    n=read();    for(int i=1;i<=n;i++) a[i]=read();    dfs1(1,0);    dfs2(n/2+1,0);    int k=read();    while(k--)    {        ll x=read();        bool flag=0;        for(int i=1;i<=tot1;i++)            if(mp.count(x-d1[i]))            {                puts("possible");                flag=1;                break;            }        if(!flag) puts("impossible");    }}

T3

题目描述 Description

在幻想乡,藤原妹红是拥有不老不死能力的人类。虽然不喜欢与人们交流,妹红仍然保护着误入迷途竹林村民。由于算得上是幻想乡最强的人类,对于她而言,迷途竹林的单向道路亦可以逆行。在妹红眼中,迷途竹林可以视为一个由N个路口(编号1..N),M条不同长度双向路连接的区域。妹红所在的红之自警队为了方便在迷途竹林中行动,绘制了一张特殊的迷途竹林地图,这张地图上只保留了N-1条道路,这些道路保证了任意两个路口间有且仅有一条路径,并且满足所有保留的道路长度之和最小,我们称这些道路为『自警队道路』。现在妹红打算在其中一个连接有多条『自警队道路』的路口设立根据地,当去掉根据地这个根据地所在路口后,就会出现某些路口间无法通过『自警队道路』相互连通的情况,我们认为这时仍然能够通过『自警队道路』连通的路口属于同一个『区域』。妹红希望最后每个『区域』的『自警队道路』总长尽可能平均,请计算出她应该选择哪一个路口作为根据地。
  下例中红色的路口为妹红选择的根据地,实线边表示『自警队道路』,绿色虚线边表示非『自警队道路』,数字表示边权,『自警队道路』中相同颜色的实线边代表属于同一个『区域』:
  
  (尽可能平均即权重最小,设每一块『区域』的路线总长为Length[i],平均路线长度为Avg=SUM{Length[i]}/区域数,权重d=∑( (Length[i]-Avg)^2 ) )

输入描述 Input Description

第1行:2个正整数N,M
  第2..M+1行:每行2个整数u,v和1个实数len,表示u,v之间存在长度为len的边

输出描述 Output Description

第1行:1个整数,最后选择的路口编号,存在多个可选路口时选择编号小的

样例输入 Sample Input

3 3
3 1 5
3 2 4
1 2 3
样例输出 Sample Output

2
数据范围及提示 Data Size & Hint

对于60%的数据:3 ≤ N ≤ 2,000,N-1 ≤ M ≤ 50,000
  对于100%的数据:3 ≤ N ≤ 40,000,N-1 ≤ M ≤ 200,000
  对于100%的数据:0 < len ≤ 100,000,000
 提示
  样例解释:
  妹红的『自警队道路』为(1,2)和(2,3)。
  只能选择2作为根据地,产生的两个区域Length[i]分别为3和4。
  所以方差为:(4-3.5)^2 + (3-3.5)^2 = 0.5

  注意:
  保证不存在相同距离的线路,两个路口间可能出现多条路径,且任意点对间至少存在一条路径。

#include<bits/stdc++.h>#define MAXN 50005#define MAXE 400005using namespace std;inline int read(){    int x=0,f=1;    char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    return x*f;}struct Edge{    int v,next;    double w;}e[MAXN*2];int head[MAXN],cnt=0;inline void addedge(int u,int v,double w){    cnt++;    e[cnt].v=v;    e[cnt].w=w;    e[cnt].next=head[u];    head[u]=cnt;}struct line{    int u,v;    double w;    bool operator<(const line &a)const{return w<a.w;}}l[MAXE];int n,m;int father[MAXN];int finds(int x){    if(father[x]==x) return x;    return father[x]=finds(father[x]);}int size[MAXN],deg[MAXN],pos;double val[MAXN],sum=0;double ans=1e40;void dfs(int x,int fa){    size[x]=1;    for(int i=head[x];i;i=e[i].next)    {        int v=e[i].v;        deg[x]++;        if(v==fa) continue;        dfs(v,x);        size[x]+=size[v];        val[x]+=val[v]+e[i].w;    }    if(deg[x]==1) return;    double avg=(double)(1.0*sum/deg[x]);    double tt=(double)(1.0*sum-val[x]);    double res=(tt-avg)*(tt-avg);    for(int i=head[x];i;i=e[i].next)    {        int v=e[i].v;        if(v==fa) continue;        tt=(double)(1.0*val[v]+e[i].w);        res+=(tt-avg)*(tt-avg);    }    if(res<ans)    {        ans=res;        pos=x;    }}int main(){    n=read(),m=read();    for(int i=1;i<=m;i++)    {        l[i].u=read(),l[i].v=read();        scanf("%lf",&l[i].w);    }    sort(l+1,l+m+1);    for(int i=1;i<=n;i++) father[i]=i;    for(int i=1;i<=m;i++)    {        int u=finds(l[i].u),v=finds(l[i].v);        if(u!=v)        {            father[v]=u;            sum+=l[i].w;            addedge(l[i].u,l[i].v,l[i].w);            addedge(l[i].v,l[i].u,l[i].w);        }    }    dfs(1,0);    cout<<pos;}
原创粉丝点击