[NOIP2010] 普及组
三国游戏
题目内容不放了
由于电脑总是会拆掉最大的组合,所以玩家最多只能得到数值第二大的组合
那么找出第二大的组合就行了
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cmath> 5 using namespace std; 6 int d[510][510]; 7 int n; 8 int fst,snd,ans; 9 int main(){ 10 scanf("%d",&n); 11 int i,j,x; 12 for(i=1;i<n;i++) 13 for(j=i+1;j<=n;j++) 14 { 15 scanf("%d",&d[i][j]); 16 d[j][i]=d[i][j]; 17 } 18 for(i=1;i<=n;i++){ 19 fst=0;snd=0; 20 for(j=1;j<=n;j++){ 21 if(d[i][j]>fst){ 22 snd=fst; 23 fst=d[i][j]; 24 } 25 else if(d[i][j]>snd)snd=d[i][j]; 26 if(snd>ans)ans=snd; 27 } 28 } 29 printf("1\n%d",ans); 30 return 0; 31 }
导弹拦截
题目描述
经过 11 年的韬光养晦,某国研发出了一种新的导弹拦截系统,凡是与它的距离不超过其工作半径的导弹都能够被它成功拦截。当工作半径为 0 时,则能够拦截与它位置恰好相同的导弹。但该导弹拦截系统也存在这样的缺陷:每套系统每天只能设定一次工作半径。而当天的使用代价,就是所有系统工作半径的平方和。
某天,雷达捕捉到敌国的导弹来袭。由于该系统尚处于试验阶段,所以只有两套系统投入工作。如果现在的要求是拦截所有的导弹,请计算这一天的最小使用代价。
输入输出格式
输入格式:
第一行包含 4 个整数x1、y1、x2、y2,每两个整数之间用一个空格隔开,表示这两套导弹拦截系统的坐标分别为(x1, y1)、(x2, y2)。 第二行包含 1 个整数 N,表示有 N颗导弹。接下来 N行,每行两个整数 x、y,中间用 一个空格隔开,表示一颗导弹的坐标(x, y)。不同导弹的坐标可能相同。
输出格式:
输出文件名 missile.out。
输出只有一行,包含一个整数,即当天的最小使用代价。
输入输出样例
0 0 10 0 2 -3 3 10 0
18
0 0 6 0 5 -4 -2 -2 3 4 0 6 -2 9 1
30
说明
两个点(x1, y1)、(x2, y2)之间距离的平方是(x1− x2)2+(y1−y2)2。
两套系统工作半径 r1、r2的平方和,是指 r1、r2 分别取平方后再求和,即 r12+r22。
【样例 1 说明】
样例1 中要拦截所有导弹,在满足最小使用代价的前提下,两套系统工作半径的平方分别为18 和0。
【样例2 说明】
样例中的导弹拦截系统和导弹所在的位置如下图所示。要拦截所有导弹,在满足最小使用代价的前提下,两套系统工作半径的平方分别为20 和10。
【数据范围】
对于10%的数据,N = 1
对于20%的数据,1 ≤ N ≤ 2
对于40%的数据,1 ≤ N ≤ 100
对于70%的数据,1 ≤ N ≤ 1000
对于100%的数据,1 ≤ N ≤ 100000,且所有坐标分量的绝对值都不超过1000。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int n; 6 int mxr2[200000]; 7 int fp; 8 int xa,xb,ya,yb;//两套系统分别为a,b 9 struct ds{ 10 int a,b; 11 }di[200000]; 12 int ncmp(ds a,ds b){//以点到a的距离为标准从小到大排序 13 return a.a<b.a; 14 } 15 int dis(int x1,int y1,int x2,int y2){//求距离 16 return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); 17 } 18 int main(){ 19 scanf("%d%d%d%d",&xa,&ya,&xb,&yb); 20 scanf("%d",&n); 21 int i,j; 22 for(i=1;i<=n;i++){ 23 int x,y; 24 scanf("%d%d",&x,&y); 25 di[i].a=dis(x,y,xa,ya); 26 di[i].b=dis(x,y,xb,yb); 27 } 28 sort(di+1,di+n+1,ncmp); 29 int mx=0; 30 mxr2[n+1]=0; 31 for(i=n;i>=1;i--){ 32 if(di[i].b>mx){ 33 mx=di[i].b; 34 } 35 mxr2[i]=mx; 36 } 37 int minn=1000000000; 38 for(i=1;i<=n;i++){ 39 int mxr1=di[i].a; 40 minn=min(minn,mxr1+mxr2[i+1]); 41 } 42 minn=min(minn,mxr2[1]); 43 cout<<minn; 44 return 0; 45 }
以其中一个雷达a为中心,从小到大排序各点到其距离,然后枚举该雷达管控的导弹数量,剩下的由雷达b管控
找最优解就行
数字统计
题目描述
请统计某个给定范围[L, R]的所有整数中,数字 2 出现的次数。比如给定范围[2, 22],数字 2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20 中出现 1 次,在数 21 中出现 1 次,在数 22 中出现 2 次,所以数字 2 在该范围内一共出现了 6
次。
输入输出格式
输入格式:
输入文件名为 two.in。
输入共 1 行,为两个正整数 L 和 R,之间用一个空格隔开。
输出格式:
输出文件名为 two.out。
输出共 1 行,表示数字 2 出现的次数。
输入输出样例
【输入样例1】 2 22 【输入样例2】 2 100
【输出样例1】 6 【输出样例2】 20
说明
1 ≤ L ≤R≤ 10000。
不用解释
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int L,R; 6 int ct(int n){ 7 int ans=0; 8 while(n){ 9 if(n%10==2)ans++; 10 n/=10; 11 } 12 return ans; 13 } 14 int main(){ 15 scanf("%d%d",&L,&R); 16 int i,j; 17 int cnt=0; 18 for(i=L;i<=R;i++){ 19 cnt+=ct(i); 20 } 21 cout<<cnt; 22 return 0; 23 }
接水问题
题目描述
学校里有一个水房,水房里一共装有 m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为 1。
现在有 n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1到 n 编号,i 号同学的接水量为 wi。接水开始时,1 到 m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学 j 完成其接水量要求 wj后,下一名排队等候接水的同学 k马上接替 j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j 同学第 x 秒结束时完成接水,则 k 同学第 x+1 秒立刻开始接水。若当前接水人数 n’不足 m,则只有 n’个龙头供水,其它 m−n’个龙头关闭。
现在给出 n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。
输入输出格式
输入格式:
输入文件名为 water.in。
第 1 行 2 个整数 n 和 m,用一个空格隔开,分别表示接水人数和龙头个数。
第 2 行 n 个整数 w1、w2、……、wn,每两个整数之间用一个空格隔开,wi表示 i 号同学的接水量。
输出格式:
输出文件名为 water.out。
输出只有一行,1 个整数,表示接水所需的总时间。
输入输出样例
【输入样例1】 5 3 4 4 1 2 1 【输入样例2】 8 4 23 71 87 32 70 93 80 76
【输出样例1】 4 【输出样例2】 163
说明
【输入输出样例 1 说明】
第 1 秒,3 人接水。第 1 秒结束时,1、2、3 号同学每人的已接水量为 1,3 号同学接完水,4 号同学接替 3 号同学开始接水。
第 2 秒,3 人接水。第 2 秒结束时,1、2 号同学每人的已接水量为 2,4 号同学的已接水量为 1。
第 3 秒,3 人接水。第 3 秒结束时,1、2 号同学每人的已接水量为 3,4 号同学的已接水量为 2。4 号同学接完水,5 号同学接替 4 号同学开始接水。
第 4 秒,3 人接水。第 4 秒结束时,1、2 号同学每人的已接水量为 4,5 号同学的已接水量为 1。1、2、5 号同学接完水,即所有人完成接水。
总接水时间为 4 秒。
【数据范围】
1≤n≤10000,1≤m≤100 且 m≤n;
1≤wi≤100。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 using namespace std; 5 int n,m,w[20000]; 6 int ans[20000]; 7 int main(){ 8 scanf("%d%d",&n,&m); 9 int i,j; 10 for(i=1;i<=n;i++)scanf("%d",&w[i]); 11 int mi; 12 for(i=1;i<=n;i++){ 13 mi=1; 14 for(int j=1;j<=m;j++)if(ans[j]<ans[mi])mi=j; 15 ans[mi]+=w[i]; 16 } 17 int mx=0; 18 for(i=1;i<=m;i++)if(ans[i]>mx)mx=ans[i]; 19 cout<<mx; 20 return 0; 21 }