用NOIP2014模拟了一发,自己水爆了= =,发现必须要写!暴!力!。
day1T1签到题,模拟一发走人。
#include
#include
#include
#include
using namespace std;
int cur,cura,curb,a[300],b[300],pointa,p,pointb,n,na,nb;
int main()
{
cin>>n>>na>>nb;
for (int i=1;i<=na;i++)
cin>>a[i];
for (int i=1;i<=nb;i++)
cin>>b[i];
cura=0;curb=0;
for (int i=1;i<=n;i++)
{
cur++;
cura++;
curb++;
if (a[cura]==b[curb]) p=1;
else if ( ( a[cura]==0 && ( b[curb]==1 || b[curb]==4 ) ) ||
( a[cura]==1 && ( b[curb]==2 || b[curb]==4 ) ) ||
( a[cura]==2 && ( b[curb]==3 || b[curb]==0 ) ) ||
( a[cura]==3 && ( b[curb]==0 || b[curb]==1 ) ) ||
( a[cura]==4 && ( b[curb]==2 || b[curb]==3 ) ) )
pointb++;else pointa++;
if (cura==na)cura=0;
if (curb==nb)curb=0;
}
cout << pointa<<' '<return 0;
}
T2写树归WA了QAQ,数据不好造就没对拍= =,然后果断WA,写暴力应该都有70分
70分做法:
写个暴力枚举每个点,然后枚举每条边两两相乘然后乘2;
100分做法:
树归啊,因为是a*b+a*c+a*d+。。。。+c*d,把它以转换变成Σa*(sum-a),记录一个sum,然后在输入的时候判断判断最大的两个点就好了。
怪我智障
#include
#include
#include
#include
using namespace std;
const int maxn = 200010,mod = 10007;
int n,w[maxn],tot,head[maxn],nextt[maxn * 2],to[maxn * 2],sum,max1,max2,ans1,ans2;
void add(int a, int b)
{
to[++tot] = b;
nextt[tot] = head[a];
head[a] = tot;
}
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n - 1; i++)
{
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
for (int i = 1; i <= n; i++)
scanf("%d", &w[i]);
for (int i = 1; i <= n; i++)
{
max1 = max2 = -1;
sum = 0;
for (int j = head[i]; j; j = nextt[j])
{
int temp = w[to[j]];
sum += temp;
sum %= mod;
if (temp > max1)
{
max2 = max1;
max1 = temp;
}
else if (temp > max2)
max2 = temp;
}
ans2 = max(ans2, max1 * max2);
for (int j = head[i];j;j = nextt[j])
{
ans1 += (w[to[j]] * (sum - w[to[j]])) % mod;
ans1 %= mod;
}
}
ans1 = (ans1 + mod) % mod;
printf("%d %d
", ans2, ans1);
return 0;
}
t3的坑以后再填
day2t1也是签到题,枚举直接过关,但是就得了70分QAQ,手贱的从d处开始搜索,应该搜索整个大范围。
#include
#include
#include
#include
#include
using namespace std;
int pic[150][150],x,y,k,ans,wifi[30000];
int cmp(const int &a,const int &b){return a>b;}
int main()
{
memset(wifi,0,sizeof(wifi));
memset(pic,0,sizeof(pic));
ans=0;
int d,n,t=0,b;
cin>>d>>n;
b=128-d;
for (int i=1;i<=n;i++)
{
cin>>x>>y>>k;
pic[x][y]=k;
}
for (int i=0;i<=128;i++)
for (int j=0;j<=128;j++)
{
t++;
for (int k2=-d;k2<=d;k2++)
{
for (int k1=-d;k1<=d;k1++)
if (k1+j>=0&&k2+i>=0) wifi[t]+=pic[i+k2][j+k1];
}
<1];
}
t2也是水题= =
正反bfs一遍,注意的是第一次bfs的元素用pair更加的方便。
还有就是对于连向不能到达的点的处理,需要另外设置一个数组来处理。
#include
#include
#include
#include
#include
using namespace std;
typedef pair<int,int>pii;
queue<int>q1;
queueq2;
struct edge{
int v,next;
}e[200010],inv[200010];
int start,final,vis1[10010],t=0,p1,p2,cant[10010],heada[200010],headb[200010],k,vis[10010],dfn,n,m;
int main()
{
cin>>n>>m;
memset(heada,0,sizeof (heada));
memset(headb,0,sizeof (headb));
memset(cant,0,sizeof(cant));
for (int i=1;i<=m;i++)
{
scanf("%d%d",&p1,&p2);
t++;
e[t].v=p2;
e[t].next=heada[p1];
heada[p1]=t;
inv[t].v=p1;
inv[t].next=headb[p2];
headb[p2]=t;
}
cin>>start>>final;
q1.push(final);
while(!q1.empty())
{
k=q1.front();
q1.pop();
for (int i=headb[k];i;i=inv[i].next)
if(!vis[inv[i].v])
{
vis[inv[i].v]=1;
q1.push(inv[i].v);
}
}
vis[final]=1;
for (int i=1;i<=n;i++)
if (!vis[i])
{
for (int j=headb[i];j;j=inv[j].next)
cant[inv[j].v]=1;
}
for (int i=1;i<=n;i++)
if (cant[i])vis[i]=0;
if (!vis[start]){cout<<-1;return 0;}
q2.push(make_pair(start,0));
vis1[start]=1;
while(!q2.empty())
{
pii x=q2.front();
q2.pop();
int x1=x.first;
for (int i=heada[x1];i;i=e[i].next)
{
if (e[i].v==final)
{
cout<1;
return 0;
}
if (vis[e[i].v]&&!vis1[e[i].v])
{
q2.push(make_pair(e[i].v,x.second+1));
vis1[e[i].v]=1;
}
}
}
for (int i=1;i<=n;i++)
cout<return 0;
}
t3解方程就放过我这个数论渣渣把,留坑以后再补
感觉NOIP要爆零了