三角形问题
给你一个由无穷个节点组成的三角形(如下图),你的任务很简单——任意给你两个正整数x和y,判断它们是否相邻(重合不是相邻)。
Input
第一行T,表示T组测试数据,接下来仅有两个32位正整数x 和y。
Output
对于每组测试数据,首先输出”Case k:”,其中k表示第几组。然后如果x和y相邻,则输出“Yes”,否则输出“No”。
Sample Input
31 11 21 11
Sample Output
Case 1:No
Case 2:Yes
Case 3:No
code1:
将三角形右边的数存起来,在判断x的位置时,使x<=a[i]
三种位置 1.右边 2.左边3.中间
<div style="text-align: left;"><span style="font-size: 10px; font-family: Arial, Helvetica, sans-serif;">#include<iostream></span></div><span style="font-size: 10px;">#include<stdio.h>
</span><div style="text-align: left;"><span style="font-size: 10px; font-family: Arial, Helvetica, sans-serif;">>
#include<math.h>
</span></div>#include<algorith
musing namespace std;
int a[35000];
<div style="text-align: left;"><span style="font-size: 10px; font-family: Arial, Helvetica, sans-serif;"> i=2;i<350</span></div>void ini()
{
a[1]=1;
for(in
t00; i++)
{
a[i]=a[i-1]+i;
}
}
<div style="text-align: left;"><span style="font-size: 10px; font-family: Arial, Helvetica, sans-serif;">int i,t,k=</span></div>int main()
{
//int a[1]=1;
ini();
0,b,aa;
scanf("%d",&t);
while(t--)
{
<div style="text-align: left;"><span style="font-size: 10px; font-family: Arial, Helvetica, sans-serif;"> printf("Cas</span></div> k++;
scanf("%d%d",&aa,&b);
e %d:",k);
for(i=1;i<=aa;i++)
{
<div style="text-align: left;"><span style="font-size: 10px; font-family: Arial, Helvetica, sans-serif;"> break;
}
if(aa==</span></div> if(aa<=a[i]&&aa>a[i-1])
a[i])
{
if(b==aa-1||b==a[i-1]||b==aa+i||b==aa+i+1)
<div style="text-align: left;"><span style="font-size: 10px; font-family: Arial, Helvetica, sans-serif;">("No\n");
}
else</span></div> printf("Yes\n");
else
print
f if(aa==a[i-1]+1)
{
if(b==aa+1||b==aa-i+1||b==aa+i+1||b==aa+i)
<div style="text-align: left;"><span style="font-size: 10px; font-family: Arial, Helvetica, sans-serif;"> }
else
{
</span></div> printf("Yes\n");
else
printf("No\n");
if(aa-b==i-1||aa-b==i||b-aa==i||b-aa==i+1||aa-b==1||b-aa==1)
printf("Yes\n");
<div style="text-align: left;"></div> else
printf("No\n");
}
}
return 0;
<div style="text-align: left;"></div>}
code2:
用二位数组模拟三角形 将x与左边的数比较
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">#include <stdio.h></span></div><div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">#include <string.h></span></div>#include <stdlib.h>
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">#include <algorithm</span></div>#include <iostream>
>
#include <queue>
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">_int64 k=2,str[4</span></div>#include <stack>
using namespace std;
_00][400];
int main()
{
memset(str,0,sizeof(str));
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">{
for(__</span></div> str[1][1]=1;
for(__int64 i=2; i<=400; i++)
int64 j=1; j<=i; j++)
{
str[i][j]=k;
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">("%d",&n);
w</span></div> k++;
}
}
int n,ll=0;
scan
fhile(n--)
{
__int64 i,x,y,j;
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> for( i=1;; i++)
{
</span></div> scanf("%I64d %I64d",&x,&y);
if(str[i][1]>x)
break;
}
i=i-1;
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> break;
ll++;
</span></div> for( j=1; j<=i; j++)
if(str[i][j]==x)
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> if(str[i][j-1]==y||str[i][j+1]==y||str[i-1][j-1]==y||str[i-1][j]==y||str[i+1][j]==y||str[i+1][j+1]==y)</span></div> {
printf("Case %d:Yes\n",ll);
}
else
<div style="text-align: left;"></div> printf("Case %d:No\n",ll);
}
return 0;
<div style="text-align: left;"></div>}
排火车
某天,Apple问起Gaga,”扑克牌排火车有没有玩过??”,”没有-_-“。Apple感到很不可思议,他决定马上教Gaga玩这个游戏。碍于手头上没有扑克牌,Apple就剪了几张卡片,然后在卡片上写上数字,然后对Gaga说“简单来讲,就是你有一堆牌,我有一堆牌,我们轮流出,每次把牌叠在上一次出的牌的下方,如果这时发现当前的牌与前面的牌有重复,那么这之间的牌就都归你了。这样到最后谁没有牌,谁就输了。”“oh,原来如此”。Gaga觉得这个也不过如此。
于是他们开始玩排火车了。。。
现在假设Apple和Gaga各有N张牌,Apple先出牌。请你给出一轮下来Apple和Gaga各获得的牌数。
Input
第一行T,表示T组测试数据,接下来有T部分。
每部分开头是一个整数N(1 <= N <= 50000),表示Apple和Gaga的牌数。接下来有2行,给出Apple和Gaga的牌的情况。首先给出Apple的牌,有N个整数,第i个整数xi(1 <= xi <= 100000)表示Apple的第i张牌面。其次给出Gaga的牌,格式类似。
Output
对于每组测试数据,首先输出”Case k:”,其中k表示第几组。然后输出 Apple和Gaga这一轮获得的牌数。
Sample Input
331 2 31 2 341 4 6 82 5 9 1035 5 56 6 6
Sample Output
Case 1:Apple:0 Gaga:6
Case 2:Apple:0 Gaga:0
Case 3:Apple:3 Gaga:3
code:
模拟 将A . G的牌按照出牌的顺序存放在数组里 再用stack 模拟
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">#include<stdio.h></span></div><div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">#include<iostream></span></div>#include<string.h>
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">ng namespace st</span></div>#include<stack>
us
id;
int a[101000],flag[101000];
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> int t,n</span></div>int main()
{
stack<int>ss;
,k=0,i,j,ans1,ans2,tem=0;
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">le(t--)
{
</span></div> scanf("%d",&t);
wh
i k++;
printf("Case %d:",k);
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">g,0,sizeof(flag));
</span></div> ans1=ans2=0;
memset(fl
a scanf("%d",&n);
for(i=0;i<n;i++)
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">i<n;i++)
scanf("%d",</span></div> scanf("%d",&a[i*2]);
for(i=0
;&a[i*2+1]);
for(i=0;i<2*n;i++)
{
if(flag[a[i]]==0)
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> }
</span></div> {
flag[a[i]]=1;
ss.push(a[i]);
else
{
while(ss.top()!=a[i])
{
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> ss.pop();
}
</span></div> flag[ss.top()]=0;
tem++;
ss.pop();
tem+=2;
flag[a[i]]=0;
if(i%2==0)
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">em=0;
}
}
</span></div> ans1+=tem;
else
ans2+=tem;
t printf("Apple:%d Gaga:%d\n",ans1,ans2);
}
return 0;
<div style="text-align: left;"></div>}
code:用数组代替stack模拟
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">#include <iostream></span></div>#include <stdio.h>
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">
using namespace s</span></div>#include <string.h
>td;
int h[100010],x[50010],y[50010];
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">T,Case=0;
sc</span></div>bool hx[100010];
int main()
{
int
anf("%d",&T);
while (T--)
{
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> memset(hx,0,sizeof(hx));
</span></div> int N,A=0,G=0,t=0,m,z;
scanf("%d",&N);
for (int i=0; i<N; i++)
{
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"><N; i++)
{
</span></div> scanf("%d",&x[i]);
}
for (int i=0;
i scanf("%d",&y[i]);
}
for (int i=0; i<2*N; i++)
{
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> if (hx[x[z]]==0)
</span></div> if (i%2==0)
{
z=i/2;
{
hx[x[z]]=1;
h[t++]=x[z];
}
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> {
</span></div> else
{
for (int j=t-1; j>=0; j--)
if (h[j]==x[z])
{
hx[h[j]]=0;
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> else hx[h[j]</span></div> m=j;
break;
}
]=0;
}
A=A+t-m+1;
t=m;
}
}
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> hx[y[z]</span></div> else
{
z=i/2;
if (hx[y[z]]==0)
{
]=1;
h[t++]=y[z];
}
else
{
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">(h[j]==y[z])
{
</span></div> for (int j=t-1; j>=0; j--)
{
if
hx[h[j]]=0;
m=j;
break;
}
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> }
}
}
</span></div> else hx[h[j]]=0;
}
G=G+t-m+1;
t=m;
printf("Case %d:Apple:%d Gaga:%d\n",++Case,A,G);
}
return 0;
<div style="text-align: left;"></div>}
三角形问题II
给定平面上的N 个点的坐标,现在你的任务是统计任意3个点构成的三角形的面积和的值。
Input
有多组数据
数据的第一行包含一个正整数T表示数据组数(1 <= T <= 100) 接下来T组数据。
对于每组数据,
第一行包含一个正整数N,代表平面上点的个数 。(1<= N <= 50,)
接下来N行,每行包含2个实数Xi, Yi,代表第i个点的坐标 (0.00 <= Xi,Yi <= 100.00小数点后至多2位)
数据不保证不会出现坐标相同的点。
Output
对于每组数据,首先输出”Case d: “,d为数据编号(从1开始)。只输出一个实数,表示面积和的值。(输出小数点后1位)
Sample Input
130 01 11 0
Sample Output
Case 1: 0.5
Hint
请使用double代替float以避免精度问题。
code:求出任意三角形构成的面积和
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">#include <iostream></span></div>#include <cstdio>
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">
#include <cmath>
</span></div>#include <cstring
>
using namespace std;
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">ouble , double> p</span></div>const int N = 55;
pair<
doint[N];
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">(pair<double, double> p1, pair<double, double> p2, pair<double, double> p3)
{
doub</span></div>double are
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">ale ans = (p2.second - p1.second) * (p3.first - p1.first) - (p2.first - p1.first) * (p3.second - p1.second);</span></div> return fabs(ans / 2.0);
}
int main()
{
int T, k = 1;
cin >> T;
while(T --){
int n;
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">
}
</span></div> cin >> n;
for(int i = 0; i < n; i ++){
cin >> point[i].first >> point[i].second
; double ans = 0.0;
for(int i = 0; i < n; i ++){
for(int j = i + 1; j < n; j ++){
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">nt[k]);
}
}
</span></div> for(int k = j + 1; k < n; k ++){
ans += area(point[i], point[j], po
i}
printf("Case %d: %.1lf\n", k ++, ans);
}
return 0;
<div style="text-align: left;"></div>}
code2:
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">#include<stdio.h></span></div>struct node
{
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">;
} nodee[55];
</span></div> double x,
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">ydouble sol(int i,int j,int k)</span></div>{
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> double x1=nodee[j].x-nodee[i].x;
</span></div>
double y1=nodee[j].y-nodee[i].y;
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;"> double y2=nodee[k].y-nodee[i].y;</span></div> double x2=nodee[k].x-nodee[i].x;
double ans=x1*y2-x2*y1;
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">2;
}
int main</span></div> if(ans>0)
return ans/2;
else
return -ans
/()
{
int i,j,k,n,t,m=0;
scanf("%d",&t);
while(t--)
{
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">r(i=0; i<n; </span></div> m++;
double ans1=0;
scanf("%d",&n);
f
oi++)
scanf("%lf%lf",&nodee[i].x,&nodee[i].y);
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">j++)
for(k=j</span></div> for(i=0; i<n-2; i++)
for(j=i+1; j<n-1;
+1; k<n; k++)
ans1=ans1+sol(i,j,k);
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">n 0;
}</span></div> printf("Case %d: %.1f\n",m,ans1);
}
retu
<div style="text-align: left;"><span style="font-family: Arial, Helvetica, sans-serif;">r</span></div>
音乐
code:贪心 每一个唱了多与一首歌曲的歌手 他所产生的fun值都要最大化,一首位于序列头 一首位于序列尾 其余散在中间(无论位子怎样 结果都是唯一的 即 n-1),这样算出一个歌手的之后 减去头尾两手音乐 (n-=2)计算下一尾歌手的音乐 这样可以使结果最大 不信你试试,
#include <iostream>
#include<string.h>
using namespace std;
int a[100],flag[100];
int main()
{
int t,n,i,ans,k=0,tt;
cin>>t;
while(t--)
{
k++;ans=0;
cin>>n;
int m=n;
memset(a,0,sizeof(a));
while(m--)
{
cin>>tt;
a[tt]++;
}
m=n;
for(i=0;i<20;i++)
{
if(a[i]>1)
{
ans+=(m-1);
m-=2;
}
}
cout<<"Case "<<k<<":"<<endl;
cout<<ans<<endl<<endl;
}
return 0;
}