文章列表
https://www.spoj.pl/problems/EQ2/
我的做法在这个网站上能过,但是过不了杭电的,郁闷了很久。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[100],b[100],c[100];
char str[105];
int aa,bb,cc;
long long suma,sumb,sumc;
long long f[105][2];
int main()
{
int i,j,k,t,cas=0,ss,tt;
...
bfs.
先找小写字母,标记每种小写原来总共的exsit[], 能过搜到的小写字母用f[]标记,搜到一个,就加一,如果搜到的是大写字母,判断f[]>exsit[] 如果是,入队,如果不是,先保存起来,之后每次判断一下,如果满足f[]>exsit[]就入队。如果搜到‘G’结束搜索,得出答案。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
char s[25][25];
int f[5],e ...
错了很久,终于明白了,原来题意理解错了,总以为输入的第一个球一定投入A, 原来第一个投的球不一定是输入的第一个。
用 next_permutation 写的:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a,b,c[11];
struct array
{
int x,y;
}s[11];
int main()
{
int n,d,i,j;
scanf(&q ...
个人觉得从一个位置下一个位置是关键,然后用树状数组就简单了。
之前举例子推推导公式时只用一个参数,一直凑不出来,后来用两个参数,一个是这列数中原来的位置,另一个是前一个位置的人跳出后,下一个人的前面和自己一共的人数。我用d表示前一个参数,k表示后一个参数。
这一题还学到反素数,真是很有用的东西。
反素数打表就行,然后线段树+二分, 还有我改得最多的main()函数:
int aa[37]= {1,2,4,6,12,24,36,48,60,120,180,240,360,720,840,1260,1680,2520,5040,7560,10080,15120 ...
用并查集,方法模仿POJ2492A Bug's Life, 这题是2*n个数,如果a和b是异性,那么a和b+n,b和a+n是同性,这样在判断a和b是否是同性时可以通过a+n,或b+n来判断。
而1182 这题是类似的方法,如果 b 被 a 吃,那么 a 和 b+n , a+n 和 b+2*n ,b 和 a+2*n
是同类。如果输入有“1 A B”, 如果A,B不同类 或 B 吃 A 则这句话是假的。
#include<cstdio>
int pre[150002];
void init(int n)
{
int i;
for(i=0;i<=n*3;i++)
...
主要错在一个地方: 本以为输入的每个数大于M就一定要被排除掉,但是,如果排除掉,在dfsI()里 大于M的数可以不取,而step却可以加一,这种情况漏掉了。
#include<iostream>
#include<cstdio>
using namespace std;
int N,M,Max,k;
int a[40];
int flag;
void dfs(int step,int sum)
{
if(flag)return;
if(sum>M)return;
//if(a[step]>M)return;
if(step ...
最近在学2-sat,也就做到了这题。开始建图建错了,用了网上模型才过。
然后我讲讲我对这个模型的理解:
A and B == 0: 建边A->!B, B->!A
A and B == 1: 建边!A->A, !B->B
A or B == 0: 建边A->!A, B->!B
A or B == 1: 建边!A->B, !B->A
A xor B == 0: 建边A->B, B->A, !A->!B, !B->!A
A xor B == 1: 建边!A->B, !B->A, A-&g ...
按A,B,C……的顺序搜索,让每个字母对应一个数,表示到这个字母时可以用的最少的频道,最后一个字母对应的最少的频道即要求的结果, 比如已经搜完了C,C对应的数是m, 轮到搜索D, D从1-m中选一种频道,如果这个频道和与D相关的字母的频道都不同,再往E搜, 如果不存在这样的频道,则D 用m种外的频道, D 对应的最少频道数即m+1。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[30][30],b[30],n;
int small = 1000 ...
没想到,在写完上一篇博文后,在代码上加了句,提交ac了。
原来是因为当数独有多种答案,我的代码会把所有可能都输出,而题目只要求一种,
所有用gs标记,如果已经输出,就停止。
这个题自己写的样例能过,但是提交总是output limit exceed。还没想明白到底哪里错了,
走过路过的帮忙看看哪里出问题?
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int a[20][20],n;
int hen[10][10],shu[10][10],kuai[10][10];
struct M
{
int x,y,k;
}s[1300];
int f(int xx,int yy)
{
if(xx>=1&&am ...
[color=brown][/color][size=xx-large][/size]
一开始看样例以为假币总是比真币重,假币总在较小的那堆里。
满足一 :某币在小于,或大于中出现的次数与不等关系出现的次数相同,
二:不在有“=”的比较中出现。
则可能是假币。满足一二的只有一个则输出,否则输出0.