1.平面切分(20年省赛——3月29日)
#include <cstdio>
#include <utility>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int, int> PII;
typedef pair<double, double> DPII;
vector <PII> arr;
vector <DPII> darr;
int main() {
int n;
scanf("%d", &n);
int ans = 1;
for (int i = 0; i < n; i ++) {
int a, b;
scanf("%d %d", &a, &b);
int node = 0;
for (int i = 0; i < arr.size(); i ++) {
int x = arr[i].first, y = arr[i].second;
if (a == x && y == b) continue; //判断重边
double cx = double(y - b) / double(a - x);
double cy = double(a * cx) + double(b);
int f = false;
for (int i = 0; i < darr.size(); i ++) {
double xx = darr[i].first, yy = darr[i].second;
if (cx == xx && cy == yy){
f = true;
break;
}
}
if (f) continue;
node ++;
darr.push_back({cx, cy});
}
darr.clear();
arr.push_back({a, b});
ans += node + 1;
}
cout << ans << endl;
return 0;
}
2、平方序列(19年国赛——3月12日)
#include <iostream>
#include<cmath>
using namespace std;
int main()
{
int x,y,c;
for(x = 2020; x<99999; x ++){
c = 2*x*x-2019*2019;
y = sqrt(c);
if(y*y == c){
cout << x+y << endl;
break;
}
}
return 0;
}
3、穿越雷区(15年省赛——3月22日)
#include <iostream>
#include <cstdio>
#include <queue>
#include <utility>
using namespace std;
typedef pair<int, int> P;
char Map[100][100];//Map表示地图数组
int Dis[100][100];//Dis表示最短路径数组
int n = 4;//n表示地图开边界大小
int ax, ay, bx, by;//保存A和B的位置
int Mx[4] = {1, 0, -1, 0}, My[4] = {0, 1, 0, -1};//移动数组
int flag = 0;
bool Check(int x, int y){
if(x >= 0 && y >= 0 && x < n && y < n && Dis[x][y] == -1)//位置合法判断
if(flag == 0 || flag == 1 && Map[x][y] == '-' || flag == -1 && Map[x][y] == '+')
return true;
if(Map[x][y] == 'B')
return true;
if(Map[x][y] == 'A' || flag == 0)
return true;
return false;
}
int BFS( ){
//初始化工作
queue<P> que;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
Dis[i][j] = -1;
que.push(P(ax, ay));
Dis[ax][ay] = 0;
//开始深度优先搜索
//不断循环直到队伍变空
while(que.size()){
P p = que.front(); que.pop();//弹出队首位置二元组放入p
if(p.first == bx && p.second == by) break;//如果队首二元组是终点位置,说明搜索到终点,得到最短路径,循环结束
if(Map[p.first][p.second] == '-') flag = -1;
else if(Map[p.first][p.second] == '+') flag = 1;
//四个方向的循环
for(int i = 0; i < 4; i++){
int nx = p.first + Mx[i], ny = p.second + My[i];
//如果下一个位置符合条件,将下一个位置二元组加入队列
if(Check(nx, ny)){
que.push(P(nx, ny));
Dis[nx][ny] = Dis[p.first][p.second] + 1;
}
}
}
return Dis[bx][by];
}
int main()
{
//freopen("in.txt", "r", stdin);
//freopen("out.txt", "w", stdout);
cin>>n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++){
cin>>Map[i][j];
if(Map[i][j] == 'A')
ax = i, ay = j;
if(Map[i][j] == 'B')
bx = i, by = j;
}
int res = BFS();
/*
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++)
cout<<Dis[i][j]<<' ';
cout<<endl;
}//
for(int i = 0; i < n; i++){
for(int j = 0; j < n; j++)
cout<<Map[i][j]<<' ';
cout<<endl;
}//
*/
cout<<res<<endl;
return 0;
}
4、大臣的旅费(13年省赛——3月27日)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
typedef long long LL;
using namespace std;
const int N=100010;
struct edge{
int END,w;
};
vector<edge>h[N];
int n,dist[N];
void dfs(int u,int father,int distance){
dist[u]=distance;
for(auto node:h[u]){
if(node.END!=father)
dfs(node.END,u,distance+node.w);
}
}
int main(){
cin>>n;
for(int i=0;i<n-1;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
h[a].push_back({b,c});
h[b].push_back({a,c});
}
dfs(1,-1,0);
int y=0;
for(int i=1;i<=n;i++){
if(dist[i]>dist[y])
y=i;
}
dfs(y,-1,0);
int maxdis=0;
for(int i=1;i<=n;i++)
if(maxdis<dist[i])
maxdis=dist[i];
LL res=(LL)10*maxdis+(LL)(1+maxdis)*maxdis/2;
printf("%lld\n",res);
return 0;
}
5、打印大X(15年省赛)
思路:照题目意思模拟即可
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
int main(){
int m,n;
cin>>m;
cin>>n;
char a[1000][1000];
for(int i=0;i<1000;i++)
{
for(int j=0;j<1000;j++){
a[i][j]='.'; //先全部打上“.”;
}
}
int k=1; //方便后移
int j;
for(int i=1;i<=n;i++) //行数,把每一行的前面的“*”输完,一直向后直到最后一行,往右下
{
for(j=k;j<k+m;j++){ //个数
a[i][j]='*'; //从前面开始放“*”
}
k++; //后移一个输出
}
int q=j-1;
k=1;
for(int i=n;i>=1;i--) //从最后一行开始打印,往右上
{
for(int j=k;j<k+m;j++)
{
a[i][j]='*';
}
k++;
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=q;j++)
cout<<a[i][j];
cout<<endl;
}
return 0;
}
6. 分巧克力(17年省赛)
思路:二分
#include <iostream>
using namespace std;
int n,k;
const int N=100010;
int h[N];
int w[N];
int MAX =0;
bool check(int x)
{
int res=0;
for(int i=0;i<n;i++)
{
res+=(h[i]/x)*(w[i]/x);
if(res >= k){
if(MAX<x){
MAX=x;
}
return true;
}
}
return false;
}
int main()
{
int low=1,high=100010;
cin>>n;
cin>>k;
for(int i=0;i<n;i++)
{
scanf("%d%d",&h[i],&w[i]);
}
while(low<high-1)
{
int mid=(low+high)/2;
if(check(mid))
low=mid;
else
high=mid;
}
printf("%d\n",MAX);
return 0;
}
7.表格计算(15年省赛)
#include <iostream>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <vector>
#include <map>
#include <queue>
#include <cstdio>
#include <string>
#include <stack>
#include <set>
#define IOS ios::sync_with_stdio(false), cin.tie(0)
using namespace std;
typedef long long ll;
const int N=1000;
string s[N][N];
double ans[N][N];
int num[5],n,m;
double dfs(int x,int y){
//如果已经计算出
if(ans[x][y]!=-1.0)return ans[x][y];
string t=s[x][y];
double sum=0;
ll len=t.length();
//如果是一个数,计算并且返回
if(t[0]>='0'&&t[0]<='9'){
for(int i=0;i<len;i++){
sum=sum*10+(t[i]-'0');
}
return ans[x][y]=sum;
}
//计算矩阵坐标(x1,y1)(x2,y2)用(num[0],num[1])(num[2],num[3])代替;
int cnt=0;
for(int i=0;i<len;i++){
if(t[i]>='0'&&t[i]<='9'){
int j=i;
num[cnt]=0;
while(j<len&&t[j]>'0'&&t[j]<='9'){
num[cnt]=num[cnt]*10+(t[j]-'0');
j++;
}
i=j;
cnt++;
}
}
//计算矩形区域的和
for(int i=num[0];i<=num[2];i++){
for(int j=num[1];j<=num[3];j++){
ans[i][j]=dfs(i,j);//递归求解ans[i][j];
sum+=ans[i][j];
}
}
//预处理均值
double avg=sum/((num[2]-num[0]+1)*(num[3]-num[1]+1));
if(t[1]=='U'){//SUM
return ans[x][y]=sum;
}
else if(t[1]=='V'){//AVG
return ans[x][y]=avg;
}
else {//STD
double Sum=0;
for(int i=num[0];i<=num[2];i++){
for(int j=num[1];j<=num[3];j++){
Sum+=(ans[i][j]-avg)*(ans[i][j]-avg);//ans[i][j]已经求出
}
}
return ans[x][y]=sqrt(Sum/((num[2]-num[0]+1)*(num[3]-num[1]+1)));
}
}
int main()
{
IOS;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
ans[i][j]=-1.0;
cin>>s[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(ans[i][j]==-1.0)
ans[i][j]=dfs(i,j);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<m;j++){
printf("%.2f ",ans[i][j]);
}
printf("%.2f\n",ans[i][m]);
}
getchar();
getchar();
return 0;
}