0924解题报告

T1

题目描述

你有 nm 颗糖果。如果有 n 个小朋友来你家,你需要分给他们每人 m 颗糖;如果来的是m 个小朋友,你就要分给每人 n 颗。你打算把糖果分装在 k 个盒子里,每个盒子分别放几颗糖由你来决定。分糖果时,盒子是不能被拆开的。(小朋友们拿到的只能是装着糖果的盒子,而不是散装的糖果)你希望最小化盒子的数量 k,使得不论来了 n 个还是 m 个小朋友,你都能按照要求给他们分糖果。

一个很魔性的题,不知道怎么就A了。。。(只是在gcd中加了点东西)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<ctime>
 6 #include<cmath>
 7 #include<algorithm>
 8 using namespace std;
 9 int n,m,t,ans;
10 void gcd(int a,int b)
11 {
12     if(b==0)  return;
13     gcd(b,a%b);
14     ans+=b*(a/b);
15 }
16 void Gcd(int a,int b)
17 {
18     if(b==0)  return;
19     for(int i=1;i<=a/b*b;i++)  printf("%d ",b);
20     Gcd(b,a%b);
21 }
22 inline int read()
23 {
24     int x=0,f=1;  char ch=getchar();
25     while(!isdigit(ch))  {if(ch==‘-‘)  f=-1;  ch=getchar();}
26     while(isdigit(ch))  {x=x*10+ch-‘0‘;  ch=getchar();}
27     return x*f;
28 }
29 int main()
30 {
31     freopen("candy.in","r",stdin);
32     freopen("candy.out","w",stdout);
33     n=read();  m=read();  t=read();
34     if(t==0)
35     {
36         if(n<m)  swap(n,m);
37         gcd(n,m);
38         printf("%d\n",ans);
39     }
40     else
41     {
42         if(n<m)  swap(n,m);
43         gcd(n,m);
44         printf("%d\n",ans);
45         Gcd(n,m);
46         printf("\n");
47     }
48     return 0;
49 }

T2

题目描述

Byteotia 由 n 座城市组成。城市之间连有 m 条道路,道路可以双向通行。其中第 i 条道路连接 ui; vi 两座城市,通过这条道路需要花费 ti 个小时。城市和道路都从 1 开始编号。Byteotia 的计时方法比较奇特,一天共有 K 个小时。我们假定一天的起始时刻是 0 点整。Byteasar 打算在某天的 0 点整从城市 x 出发,前往城市 y。旅途中只能沿着道路行走,而不允许原地休息。Byteasar 不在乎自己的旅行花费了多少天,他只希望到达 y 的时刻在一天中尽可能早,即如果在某天的 T 点整 (0 T < K) 到达城市 y,他希望使得 T 尽可能小。为了达到这一目标,Byteasar 的旅行路径中允许多次经过同一条道路,也允许多次经过同一个城市(包括 x; y)。如果多次经过 y,最后一次到达 y 的时刻才算作到达时刻。Byteasar 可能有多组旅行计划,他想寻求你的帮助。Byteotia 的计时方法也常常改变,所以你需要对每一组 xj ; yj ;Kj 求出最小的 T。

问题实质是求出 x 到 y 的路径,路径长度模 K 后最小。

于是随便用二分图搞一搞,然而wa了几组,不知道为什么。

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<ctime>
 6 #include<cmath>
 7 #include<algorithm>
 8 using namespace std;
 9 #define MAXN 50010
10 struct node{int y,next,v;}e[MAXN*2];
11 int n,m,k,len,flag,f[MAXN],Link[MAXN],g[MAXN],c[MAXN],check[MAXN];
12 inline int read()
13 {
14     int x=0,f=1;  char ch=getchar();
15     while(!isdigit(ch))  {if(ch==‘-‘)  f=-1;  ch=getchar();}
16     while(isdigit(ch))  {x=x*10+ch-‘0‘;  ch=getchar();}
17     return x*f;
18 }
19 int find(int x)  {return f[x]==x?x:f[x]=find(f[x]);}
20 int gcd(int a,int b)  {return b==0?a:gcd(b,a%b);}
21 void insert(int x,int y,int v)  {e[++len].next=Link[x];  Link[x]=len;  e[len].y=y;  e[len].v=v;}
22 bool color(int x,int cl)
23 {
24     c[x]=cl;
25     for(int i=Link[x];i;i=e[i].next)
26     {
27         if(!c[e[i].y])
28         {
29             if(!color(e[i].y,3-cl))  return 0;
30         }
31         else if(c[e[i].y]==cl)  return 0;
32     }
33     return 1;
34 }
35 int main()
36 {
37     freopen("pod.in","r",stdin);
38     freopen("pod.out","w",stdout);
39     n=read();  m=read();  k=read();
40     for(int i=1;i<=n;i++)  f[i]=i;
41     for(int i=1;i<=m;i++)
42     {
43         int x=read(),y=read(),v=read();
44         if(rand()%2)  swap(x,y);
45         insert(x,y,v);  insert(y,x,v);
46         x=find(x);  y=find(y);
47         f[x]=y;  g[y]=gcd(gcd(g[y],g[x]),v);
48     }
49     for(int i=1;i<=n;i++)
50         if(!c[i])
51             if(!color(i,1))  check[find(i)]=1;
52     for(int i=1;i<=k;i++)
53     {
54         int x=read(),y=read(),mo=read();
55         int d=gcd(g[find(y)],mo);
56         if(find(x)!=find(y))  printf("NIE\n");
57         else if((mo/d)&1)printf("0\n");
58         else if(check[find(x)])  printf("0\n");
59         else if(c[x]==c[y])  printf("0\n");
60         else printf("%d\n",d);
61     }
62     return 0;
63 }

T3

最近 JC 同学刚学会 gcd,于是迷上了与 gcd 有关的问题。今天他又出了一道这样的题目,
想要考考你,你能顺利完成吗?
给定一个长度为 n 的字符串 s[1::n],串仅包含小写字母。对于区间 [l; r],你需要回答 s[l::r]
中有多少个长度为 3 的子序列组成了"gcd",即有多少组 (i; j; k) 满足 l i < j < k r; s[i] =
‘g‘; s[j] = ‘c‘; s[k] = ‘d‘。

一个奇怪的前缀和维护。(各种前缀和,各种恶心)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<algorithm>
using namespace std;
int n,sl[80010],sr[80010],ssl[80010],ssr[80010],slr[80010],su[80010];
char ch[80010];
inline int read()
{
    int x=0,f=1;  char ch=getchar();
    while(!isdigit(ch))  {if(ch==‘-‘)  f=-1;  ch=getchar();}
    while(isdigit(ch))  {x=x*10+ch-‘0‘;  ch=getchar();}
    return x*f;
}
int main()
{
    freopen("gcd.in","r",stdin);
    freopen("gcd.out","w",stdout);
    scanf("%s",ch+1);  n=strlen(ch+1);
    for(int i=1;i<=n;i++)  sl[i]=sl[i-1]+(ch[i]==‘g‘);
    for(int i=n;i;i--)     sr[i]=sr[i+1]+(ch[i]==‘d‘);
    for(int i=1;i<=n;i++)
    {
        slr[i]=slr[i-1]+(ch[i]==‘c‘)*sl[i]*sr[i];
        ssl[i]=ssl[i-1]+(ch[i]==‘c‘)*sl[i];
        ssr[i]=ssr[i-1]+(ch[i]==‘c‘)*sr[i];
        su[i]=su[i-1]+(ch[i]==‘c‘);
    }
    int q=read();
    while(q--)
    {
        int x=read(),y=read();
        int ans=slr[y]-slr[x-1]-(ssr[y]-ssr[x-1])*sl[x-1]-(ssl[y]-ssl[x-1])*sr[y+1]+(su[y]-su[x-1])*sl[x-1]*sr[y+1];
        ans&=(~(1<<31));
        printf("%d\n",ans);
    }
    return 0;
}

考试前被Cydiater坑了一把,没有在现场参加考试,只能在家颓废,最后只交了一道题,还好,长者保佑,A掉了。

然而写题时,T2和T3都没有想出正解,由此可见我还是很弱,与此同时Cydiater现场A掉2题。

时间: 2024-10-16 12:46:11

0924解题报告的相关文章

解题报告 之 POJ3057 Evacuation

解题报告 之 POJ3057 Evacuation Description Fires can be disastrous, especially when a fire breaks out in a room that is completely filled with people. Rooms usually have a couple of exits and emergency exits, but with everyone rushing out at the same time

hdu 1541 Stars 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 题目意思:有 N 颗星星,每颗星星都有各自的等级.给出每颗星星的坐标(x, y),它的等级由所有比它低层(或者同层)的或者在它左手边的星星数决定.计算出每个等级(0 ~ n-1)的星星各有多少颗. 我只能说,题目换了一下就不会变通了,泪~~~~ 星星的分布是不是很像树状数组呢~~~没错,就是树状数组题来滴! 按照题目输入,当前星星与后面的星星没有关系.所以只要把 x 之前的横坐标加起来就可以了

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告

2016 第七届蓝桥杯 c/c++ B组省赛真题及解题报告 勘误1:第6题第4个 if最后一个条件粗心写错了,答案应为1580. 条件应为abs(a[3]-a[7])!=1,宝宝心理苦啊.!感谢zzh童鞋的提醒. 勘误2:第7题在推断连通的时候条件写错了,后两个if条件中是应该是<=12 落了一个等于号.正确答案应为116. 1.煤球数目 有一堆煤球.堆成三角棱锥形.详细: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形). -. 假设一共

[noip2011]铺地毯(carpet)解题报告

最近在写noip2011的题,备战noip,先给自己加个油! 下面是noip2011的试题和自己的解题报告,希望对大家有帮助,题目1如下 1.铺地毯(carpet.cpp/c/pas) [问题描述]为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有n 张地毯,编号从1 到n.现在将这些地毯按照编号从小到大的顺序平行于坐标轴先后铺设,后铺的地毯覆盖在前面已经铺好的地毯之上.地毯铺设完成后,组织者想知道覆盖地面某个点的最上面的那张地毯的

ACdream 1203 - KIDx&#39;s Triangle(解题报告)

KIDx's Triangle Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description One day, KIDx solved a math problem for middle students in seconds! And than he created this problem. N

解题报告 之 CodeForces 91B Queue

解题报告 之 CodeForces 91B Queue Description There are n walruses standing in a queue in an airport. They are numbered starting from the queue's tail: the 1-st walrus stands at the end of the queue and the n-th walrus stands at the beginning of the queue.

解题报告 之 POJ1226 Substrings

解题报告 之 POJ1226 Substrings Description You are given a number of case-sensitive strings of alphabetic characters, find the largest string X, such that either X, or its inverse can be found as a substring of any of the given strings. Input The first li

解题报告 之 UVA563 Crimewave

解题报告 之 UVA563 Crimewave Description Nieuw Knollendam is a very modern town. This becomes clear already when looking at the layout of its map, which is just a rectangular grid of streets and avenues. Being an important trade centre, Nieuw Knollendam a